P4172 WC2006 水管局長

2022-05-19 11:29:05 字數 1865 閱讀 9800

傳送門

顯然 $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鏈上的最大邊,替換 第二點的實現比較有意思 因為是在樹上加邊,所以一定會形成乙個環,那麼...