Luogu P4172 WC2006 水管局長

2022-05-12 11:31:21 字數 1392 閱讀 6129

給定乙個 \(n\) 個點 \(m\) 條邊的圖和 \(q\) 次操作,每次操作分為以下兩種:

\(\texttt1\leq u\leq 10^3,1\leq m,q\leq 10^5\)

邊權最大的邊的權值最小,考慮用 \(\texttt\) 維護原圖的最小生成樹。同時由於存在斷邊操作不好維護,所以考慮時間倒流。

首先先將所有沒有被割去的邊連起來,然後對於每乙個割邊操作,由於時間倒流了,所以在原圖上連邊,找新的最小生成樹。

這裡涉及到割掉環上邊權最大的邊的操作,為了更好的處理這個操作,可以在 \(\texttt\) 上維護乙個 \(mx_i\) 表示以 \(i\) 為根的子樹上點權最大的是哪個。

注意到我們將原樹上的邊拆成了點,而原樹上的點在 \(\texttt\) 上的權值為 \(0\),所以這樣做是正確的。

#includeusing namespace std;

typedef int ll;

typedef long long int li;

const ll maxn=2e5+51;

struct edge

inline void update(ll x)

inline void reverse(ll x)

inline void spread(ll x)

}inline void rotate(ll x)

nd[x].ch[!dir]=fa,nd[fa].ch[dir]=son;

if(son)

nd[fa].fa=x,nd[x].fa=gfa,update(fa);

}inline void splay(ll x)

while(cur)

while(nroot(x))

rotate(x);

}update(x);

}inline void access(ll x)

}inline void makeroot(ll x)

inline void link(ll edx,ll x,ll y)

inline void cut(ll x)

#undef ls

#undef rs

};}lct::linkcuttree lct;

int main()

for(register int i=1;i<=qcnt;i++)

}for(register int i=0;i<=n;i++)

sort(ed+1,ed+m+1),cnt=n*2-1;

for(register int i=1;cnt>n;i++)

}cnt=0;

for(register int i=qcnt;i;i--)

if(op[i]==2)}}

while(cnt)

}

P4172 WC2006 水管局長

題目鏈結 題目背景 sc 省 my 市有著龐大的地下水管網路,嘟嘟是 my 市的水管局長 就是管水管的啦 題目描述 每天供水公司可能要將一定量的水從 u uu 處送往 v vv 處,嘟嘟需要為供水公司找到一條從 u uu 至 v vv 的水管的路徑,接著通過資訊化的控制中心通知路徑上的水管進入準備送...

P4172 WC2006 水管局長

bzoj 那個是加強版 lct 維護動態最小瓶頸樹 題意 給乙個圖,每次詢問兩個點之間路徑的最大值的最小值,或斷開乙個邊,始終保證圖連通 用 lct 維護,發現斷邊不怎麼好做,所以離線下來倒序處理,常規套路 就是先跑乙個最小瓶頸生成樹,然後每次加邊,如果加的這個邊的邊權大於它兩個端點間原來路徑的最大...

P4172 WC2006 水管局長

傳送門 顯然 lct 動態維護最小生成樹 詢問就是問樹上兩點的路徑中權值最大的邊 為了維護邊權,我們要把邊也看成點,為了方便,邊在 lct 中的編號為 n 1 到 n m 因為正做不好維護刪邊,所以離線倒過來,變成加邊 在反過來做的時候,為了維護最小生成樹要知道哪些邊被刪除了 用 set 或者 ma...