HNOI2010 城市建設 動態最小生成樹

2021-09-09 06:40:45 字數 3012 閱讀 5567

傳送門

大意:給你一棵樹,每次永久修改一條邊權,詢問當前最小生成樹

做法真的妙妙的

考慮到無論我們怎麼修改某條邊的邊權

都總有一些邊可以被選到

也總有一些邊不會被選到

因此就引入了兩個操作

c on

trac

tion

:contraction:

contra

ctio

n:我們將當前分治區間的所有要修改的邊全部賦為−in

f-inf

−inf

那麼顯然當前如果在mst

mstms

t中的邊肯定會在mst

mstms

t中那我們就可以把這些邊縮成乙個點來縮小圖的規模

r ed

ucti

on

reduction

reduct

ion

同理將這些邊賦為inf

infin

f 那麼此時不在mst

mstms

t中的邊肯定不會在mst

mstms

t內那這些邊我們就可以棄掉不要了

注意理解我們在分治的每一層都進行了這個操作

這樣減少的點是逐漸遞進的

而這樣到最後l=r

l=rl=

r的時候就已經只剩會影響的邊了

便可以快速統計答案了

複雜度o(n

log2

n)

o(nlog^2)

o(nlog

2n)

#include

using

namespace std;

#define ll long long

inline

intread()

while

(isdigit

(ch)

)res=

(res<<3)

+(res<<1)

+(ch^48)

,ch=

getchar()

;return res*f;

}const

int n=

50005

;const

int log=20;

const ll inf=

0x3f3f3f3f

;int m,n,k,ans[n]

,fa[n]

,num[log]

,a[n]

,rk[n]

,p[n]

;struct edgee[log]

[n],q1[n]

,q2[n]

;inline

bool

comp

(const edge &a,

const edge &b)

struct askq[n]

;inline

void

init

(int tot)

}int

find

(int x)

inline

void

merge

(int u,

int v)

inline

void

contraction

(int

&tot,ll &now)

for(

int i=

1;i<=cnt;i++

)for

(int i=

1;i<=cnt;i++

) cnt=0;

for(

int i=

1;i<=tot;i++)}

for(

int i=

1;i<=cnt;i++

)q1[i]

=q2[i]

; tot=cnt;

}inline

void

reduction

(int

&tot)

else

if(q1[i]

.val==inf)q2[

++cnt]

=q1[i]

,p[q1[i]

.pos]

=cnt;

}for

(int i=

1;i<=cnt;i++

)q1[i]

=q2[i]

; tot=cnt;

}#define mid ((l+r)>>1)

void

cdq(

int l,

int r,

int dep,ll now)

return;}

for(

int i=l;i<=r;i++

)q1[p[q[i]

.pos]

].val=

-inf;

contraction

(tot,now)

;for

(int i=l;i<=r;i++

)q1[p[q[i]

.pos]

].val=inf;

reduction

(tot)

;for

(int i=

1;i<=tot;i++

)e[dep+1]

[i]=q1[i]

; num[dep+1]

=tot;

cdq(l,mid,dep+

1,now)

;cdq

(mid+

1,r,dep+

1,now);}

#undef mid

intmain()

;}for(

int i=

1;i<=k;i++

) num[0]

=m;cdq(1

,k,0,0

);for(

int i=

1;i<=k;i++

)return0;

}

CDQ分治 HNOI2010 城市建設

題目鏈結 線段樹分治 lct只有80 然後就有了cdq分治的做法 把不可能在生成樹里的扔到後面 把一定在生成樹里的扔到並查集裡存起來 分治到l r,修改邊權,跑個kruskal就行了 由於要支援撤銷,並查集要按秩合併 include cstdio include cstring include io...

HNOI2010 CITY城市建設

動態改邊權ms t mst 考慮和線段樹分治 l ct lc t一樣的思想,對修改時間分治 考慮一段時間的修改的那些邊 暴力就是當l r l r 時直接讓修改生效 然後求一遍ms t role presentation style position relative mst mst 這樣是不行的因為...

2001 Hnoi2010 City 城市建設

time limit 20 sec memory limit 162 mb submit 1098 solved 539 submit status discuss ps國是乙個擁有諸多城市的大國,國王louis為城市的交通建設可謂絞盡腦汁。louis可以在某些城市之間修建道路,在不同的城市之間修建...