給定乙個 \(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...