P2542 AHOI2005 航線規劃

2022-06-24 18:03:11 字數 3019 閱讀 9651

對 samuel 星球的探險已經取得了非常巨大的成就,於是科學家們將目光投向了 samuel 星球所在的星系——乙個巨大的由千百萬星球構成的 samuel 星系。

星際空間站的 samuel ii 巨型計算機經過長期探測,已經鎖定了 samuel 星系中 \(n\) 個星球的空間座標,並對這些星球以 \(1\) 至 \(n\) 依次編號。

一些先遣飛船已經出發,在星球之間開闢探險航線。

探險航線是雙向的,例如從 \(1\) 號星球到 \(3\) 號星球開闢探險航線,那麼從 \(3\) 號星球到 \(1\) 號星球也可以使用這條航線。

例如下圖所示:

在 \(5\) 個星球之間,有 \(5\) 條探險航線。

\(a,b\) 兩星球之間,如果某條航線不存在,就無法從 \(a\) 星球抵達 \(b\) 星球,我們則稱這條航線為關鍵航線。

顯然上圖中,\(1\) 號與 \(5\) 號星球之間的關鍵航線有 \(1\) 條:即為 \(4\leftrightarrow5\) 航線。

然而,在宇宙中一些未知的磁暴和行星的衝撞,使得已有的某些航線被破壞,隨著越來越多的航線被破壞,探險飛船又不能及時恢復這些航線,可見兩個星球之間的關鍵航線會越來越多。

假設在上圖中,航線 $4\leftrightarrow24(從 \(4\) 號星球到 \(2\) 號星球)被破壞。此時,\(1\) 號與 \(5\) 號星球之間的關鍵航線就有 \(3\) 條:\(1 \leftrightarrow 3\),\(3 \leftrightarrow 4\),\(4 \leftrightarrow 5\)。

小聯的任務是,不斷關注航線被破壞的情況,並隨時給出兩個星球之間的關鍵航線數目。現在請你幫助完成。

第一行有兩個整數,分別表示星球個數 \(n\) 和初始時的航線條數 \(m\)。

接下來 \(m\) 行,每行有兩個不相同的整數 \(u,v\),表示星球 \(u\) 和星球 \(v\) 之間存在一條航線。

接下來有若干行,每行首先給出乙個整數 \(op\),表示一次操作的型別。

若 \(op=1\),則後接兩個整數 \(u,v\),表示詢問當前 \(u,v\) 兩星球之間有多少關鍵航線。

若 \(op=0\),則後接兩個整數 \(u,v\),表示 \(u,v\) 之間的航線被破壞。

若 \(op=−1\),則表示輸入結束,後面不再存在操作。

對每個 \(op=1\) 的詢問,輸出一行乙個整數表示關鍵航線數目。

輸入

5 5

1 21 3

3 44 5

4 21 1 5

0 4 2

1 5 1

-1

輸出
1

3

資料規模與約定

對於全部的測試點,保證:

\(1 \leq n \leq 3 \times 10^4,1 \leq m \leq 10^5\)

$ -1 \leq op \leq 1,1 \leq u, v \leq n$

無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。

對於 \(op=0\) 的操作,保證操作前航線 \(u \leftrightarrow v\) 存在。

詢問與破壞航線的總次數不超過 \(4 \times 10^4\)

時間逆序, 變成了加邊,

來到例題

只不過變成了兩點之間的橋

還是dfs序的好性質, 記錄dfs序和離開當前點的dfs序low, 則 x 的孩子dfs 都大於 dfn[x] 小於等於 low[x]

通過樹狀陣列巧妙維護樹形結構 x 到 樹根 的距離, 則每次詢問就是 ask(x) + ask(y) - 2 * ask(lca(x,y))

關鍵是加邊的時候 怎麼維護 x 到根的距離,

跟例題一樣, 在並查集爬樹的時候, add(dfn[x], 1), add(low[x] + 1, -1) 即可

struct stfrom 

void bfs(int s) }}

int lca(int x, int y)

int dist(int x, int y)

} st;

struct node ;

int n, m, _, k, cas;

int f[n], c[n], dfn[n], low[n], df;

pii ed[m];

vectorh[n], ans;

vectore;

setes;

int ff(int x)

void add(int x, int k)

int ask(int x)

void dfs(int x, int fa)

int main()

stackst;

for (int op, x, y; cin >> op, op != -1;) ), ans.pb(0);

else st.push(), es.insert();

}rep(i, 1, m) if (!es.count(ed[i]))

if (ff(ed[i].fi) == ff(ed[i].se)) e.push_back();

else h[ed[i].fi].pb(ed[i].se), h[ed[i].se].pb(ed[i].fi), f[f[ed[i].fi]] = f[ed[i].se];

st.init(n, h); st.bfs(1); dfs(1, 0);

rep(i, 1, n) f[i] = i;// add(dfn[i], st.dep[i] - 1);

while (!e.empty()) st.push(e.back()), e.pop_back();

while (!st.empty())

else

}for (auto& i : ans) cout << i << '\n';

return 0;

}

AHOI2005 航線規劃

點此看題 題意 略 說明 提示 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。資料範圍 1 n 30000,1 m 100000,1 q 40000 1 leq n leq 30000,1 leq m leq 100000...

AHOI2005 航線規劃

給乙個n個點m條邊的圖,有兩種操作 詢問x到y的路徑必經的邊有幾條,刪除x,y之間的直接連邊。1 n 30000,1 m 100000,操作總數不超過40000 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。必經邊就是橋 ...

P1403 AHOI2005 約數研究

科學家們在samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型計算機 samuel ii 的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用 samuel ii 進行數學研究。小聯最近在研究和約數有關的問題,他統計每個正數n的約數的個數,並以f n 來表示。例...