Luogu P4172水管局長(LCT)

2022-05-01 00:51:19 字數 1893 閱讀 7874

題目鏈結

有個結論是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 維護,發現斷邊不怎麼好做,所以離線下來倒序處理,常規套路 就是先跑乙個最小瓶頸生成樹,然後每次加邊,如果加的這個邊的邊權大於它兩個端點間原來路徑的最大...