題解 WC2006 水管局長

2022-02-27 13:42:45 字數 1549 閱讀 5606

感覺這題好強啊……本來以為能過,結果毫無疑問的被ge了一頓……在這裡記錄一下做的過程,也免得以後又忘記啦。

首先,我們應看出在這張圖上,要讓經過的水管最長的最短,就是要維護一棵動態的最小生成樹。只是刪除邊不是很好操作,所以我們將刪邊改為加邊,反向處理。如果發現新加的邊可以更新最小生成樹,我們就應該更新圖,刪去原圖中最大的一條邊。所以在lct上我們要多維護乙個資訊,即當前最大的那條邊是哪一條邊。至此,大部分的難點都已解決,只是lct維護的是點上的資訊,而這道題的權值都在邊上。我們將邊轉化成點,要將要鏈結的兩個點分別與另一點相連,將資訊存在另乙個點上即可。

the road is tough and there's still a long way to go. try your best and don't regret.

#include using

namespace

std;

#define maxn 150005

#define maxm 1500000

intn, m, opt[maxm], cnp, x[maxm], y[maxm];

intq[maxm], id, t[maxm];

inttot, ans[maxn], mark[maxn];

map

map[maxn];

struct

node

p[maxm];

struct

edge

}e[maxn];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void push_down(int

x) void update(int

x)bool is_root(int x)

void rotate(int

x)void splay(int

x) update(x);

}void access(intx)}

void make_root(int x)

void split(int u, int

v) void link(int u, int v)

void cut(int u, int v)

int get_fa(int

x)int

main()

sort(e + 1, e + 1 +m);

for(int i = 1; i <= m; i ++) map[e[i].u][e[i].v] = map[e[i].v][e[i].u] =i;

for(int i = 1; i <= q; i ++)

for(int i = 1; i <= m; i ++)

}for(int i = q; i; i --)}}

for(int i = tot; i; i --)

printf(

"%d\n

", ans[i]);

return0;

}

WC2006 水管局長

傳送門 今天終於找到了一種比較方便好懂的用lct維護生成樹的辦法。以前用 mrclr 的方法 不是很理解,然後我寫在這道題的時候還錯了 首先先看一下這道題。這很明顯就是讓我們動態的維護乙個最小生成樹。不過因為刪邊的過程很難維護,所以我們改成先把邊存起來,之後倒序回加。一開始我們先用lct模擬krus...

WC2006 水管局長資料加強版

sc省my市有著龐大的地下水管網路,嘟嘟是my市的水管局長 就是管水管的啦 嘟嘟作為水管局長的工作就是 每天供水公司可能要將一定量的水從x處送往y處,嘟嘟需要為供水公司找到一條從a至b的水管的路徑,接著通過資訊化的控制中心通知路徑上的水管進入準備送水狀態,等到路徑上每一條水管都準備好了,供水公司就可...

WC2006 水管局長 LCT維護最小生成樹

貌似要省選了?似乎不關我這個蒟蒻的事,還是給oiers們加油吧!第一次學到了邊轉換為點的神奇操作。luogu傳送門 由於要找路徑上的最小的最長度 很繞自理解 還是很容易就想到最小生成樹的。再由於想到維護最小生成樹的時候刪邊還是很複雜的就想到這道題的刪邊離線倒著來做,將刪邊轉換成加邊來做就吼了。但是權...