題目鏈結
有個結論是x到y的路徑上最長邊權值等於最小生成樹上最長邊權值,於是問題轉化為最小生成樹。
再考慮把問題反過來,刪邊變成加邊。
於是變成動態維護最小生成樹,lct可以做到。
#include#include#include
#include
#include
#include
#define maxn 200020
using
namespace
std;
inline
long
long
read()
while
(isdigit(ch))
return num*f;
}struct
edge
}edge[maxn];
intstack[maxn],top;
struct
splaytree[maxn];
inline
int iden(int x)
inline
void connect(int x,int fa,int how)
inline
bool isroot(int x)
inline
void update(int
x) inline
void reverse(int
x) inline
void pushdown(int
x)
void rotate(int
x) inline
void pushto(int
x) pushdown(x);
while(top) pushdown(stack[top--]);
}void splay(int
x) update(x);
}inline
void access(int
x) }
inline
void makeroot(int
x) inline
int findroot(int
x) inline
void split(int x,int
y) inline
void link(int x,int
y) inline
void cut(int x,int
y)}s;
struct
queq[maxn];
intcnt;
intans[maxn];
int d[maxn*10
];bool
vis[maxn];
intmain();
if(edge[i].from>edge[i].to) swap(edge[i].from
,edge[i].to);
}sort(edge+1,edge+m+1
);
for(int i=1;i<=m;++i)
for(int i=1;i<=e;++i);
if(q[i].x>q[i].y) swap(q[i].x,q[i].y);
if(q[i].opt==1) q[i].id=++cnt;
else
}int sum=0
;
for(int i=1;i<=m;++i)
for(int i=e;i;--i)
else}}
for(int i=1;i<=cnt;++i) printf("
%d\n
",ans[i]);
return0;
}
Luogu P4172 WC2006 水管局長
給定乙個 n 個點 m 條邊的圖和 q 次操作,每次操作分為以下兩種 texttt1 leq u leq 10 3,1 leq m,q leq 10 5 邊權最大的邊的權值最小,考慮用 texttt 維護原圖的最小生成樹。同時由於存在斷邊操作不好維護,所以考慮時間倒流。首先先將所有沒有被割去的邊連起...
P4172 WC2006 水管局長
題目鏈結 題目背景 sc 省 my 市有著龐大的地下水管網路,嘟嘟是 my 市的水管局長 就是管水管的啦 題目描述 每天供水公司可能要將一定量的水從 u uu 處送往 v vv 處,嘟嘟需要為供水公司找到一條從 u uu 至 v vv 的水管的路徑,接著通過資訊化的控制中心通知路徑上的水管進入準備送...
P4172 WC2006 水管局長
bzoj 那個是加強版 lct 維護動態最小瓶頸樹 題意 給乙個圖,每次詢問兩個點之間路徑的最大值的最小值,或斷開乙個邊,始終保證圖連通 用 lct 維護,發現斷邊不怎麼好做,所以離線下來倒序處理,常規套路 就是先跑乙個最小瓶頸生成樹,然後每次加邊,如果加的這個邊的邊權大於它兩個端點間原來路徑的最大...