傳送門
顯然 $lct$ 動態維護最小生成樹
詢問就是問樹上兩點的路徑中權值最大的邊
為了維護邊權,我們要把邊也看成點,為了方便,邊在 $lct$ 中的編號為 $n+1$ 到 $n+m$
因為正做不好維護刪邊,所以離線倒過來,變成加邊
在反過來做的時候,為了維護最小生成樹要知道哪些邊被刪除了
用 $set$ 或者 $map$ 並不好維護,但是因為點數不大,所以直接暴力開二維陣列就好
注意洛谷資料中可能給的邊是 $(u,v)$ ,但是刪除的邊是 $(v,u)$
#include#include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;inline
intread()
while(ch>='
0'&&ch<='
9')
return x*f;
}const
int n=2e5+7
;int c[n][2],fa[n],t[n],val[n];//
t維護的是最大值的編號,val是本身的值
bool
rev[n];
inline
void pushup(int
x)inline
void pushdown(int
x)inline
void rever(int x)
inline
bool noroot(int x)
inline
void rotate(int
x)inline
void push_tag(int
x)inline
void splay(int
x) rotate(x);
}}inline
void access(int
x)inline
void makeroot(int
x) inline
int findroot(int
x)inline
int split(int x,int y) //
返回路徑上最大邊的編號
inline void link(int x,int y)
inline
void cut(int x,int y)
//以上為lct模板
intn,m,q,ans[n];
int mp[1007][1007],id[n],opt[n],dx[n],dy[n];//
mp[u][v]維護邊(u,v)的編號,id[i]維護第i次操作刪的邊
//opt,dx,dy存讀入資料
bool p[n];//
判斷邊是否被刪除
struct
edgee[n];
//存邊
inline void insert(int k)//
加入編號為k的邊
if(flag) link(x,n+k),link(y,n+k);//連邊}
intmain()
for(int i=1;i<=q;i++)
for(int i=1;i<=m;i++) if(!p[i]) insert(i);
for(int i=q;i>=1;i--)
insert(id[i]);
}for(int i=1;i<=q;i++) if(opt[i]==1) printf("
%d\n
",ans[i]);
return0;
}
P4172 WC2006 水管局長
題目鏈結 題目背景 sc 省 my 市有著龐大的地下水管網路,嘟嘟是 my 市的水管局長 就是管水管的啦 題目描述 每天供水公司可能要將一定量的水從 u uu 處送往 v vv 處,嘟嘟需要為供水公司找到一條從 u uu 至 v vv 的水管的路徑,接著通過資訊化的控制中心通知路徑上的水管進入準備送...
P4172 WC2006 水管局長
bzoj 那個是加強版 lct 維護動態最小瓶頸樹 題意 給乙個圖,每次詢問兩個點之間路徑的最大值的最小值,或斷開乙個邊,始終保證圖連通 用 lct 維護,發現斷邊不怎麼好做,所以離線下來倒序處理,常規套路 就是先跑乙個最小瓶頸生成樹,然後每次加邊,如果加的這個邊的邊權大於它兩個端點間原來路徑的最大...
洛谷P4172 WC2006 水管局長
lct動態維護最小生成樹的典例 這個都是套路,倒序處理,將刪邊變成加邊 再將邊換成點,然後就可以做到點權維護邊權資訊 說一下加邊的過程大概是 一 首先最小生成樹,保證初始最優 二 對於新加入的一條邊,找出原x y鏈上的最大邊,替換 第二點的實現比較有意思 因為是在樹上加邊,所以一定會形成乙個環,那麼...