HNOI2010 CITY城市建設

2021-08-18 04:38:16 字數 2828 閱讀 2990

動態改邊權ms

t mst

考慮和線段樹分治+l

ct+ lc

t一樣的思想,對修改時間分治

考慮一段時間的修改的那些邊

暴力就是當l=

r l=r

時直接讓修改生效

, ,

然後求一遍ms

t' role="presentation" style="position: relative;">mst

mst

這樣是不行的因為圖的規模沒有還是

m m

所以在每一層分治中就是考慮怎麼縮小圖的規模

考慮乙個修改的兩種極端情況

1.' role="presentation" style="position: relative;">1.

1.把這條邊變成−∞

∞我們把這個分治區間[l

,r] [l,

r]

要修改的邊邊權全部賦值為−∞

, −∞,

然後求一遍ms

t mst

那麼可以發現

, ,

當前還在ms

t' role="presentation" style="position: relative;">mst

mst中的非−∞

∞邊在以後也一定會在ms

t mst

中所以我們考慮縮點,把這些邊連成的聯通塊縮成乙個點

, ,

然後把答案加上

這樣是會形成乙個森林的

,' role="presentation" style="position: relative;">,

,所以我們要把連線森林的邊存下來繼續分治

2. 2.

把這條邊變成

∞ ∞

我們把這個分治區間[l

,r] [l,

r]

要修改的邊邊權全部賦值為∞,

,然後求一遍ms

t mst

那麼可以發現

, ,

當前不在ms

t' role="presentation" style="position: relative;">mst

mst中的邊在之後的分治過程中一定是不需要了的

所以我們只要儲存那些ms

t mst

中的邊和權值為

∞ ∞

的邊,然後繼續分治

#include

#define fp(i,a,b) for(register int i=a,i=b+1;i#define fd(i,a,b) for(register int i=a,i=b-1;i>i;--i)

#define go(u) for(register int i=fi[u],v=e[i].to;i;v=e[i=e[i].nx].to)

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

template

inline

bool cmax(t&a,const t&b)

template

inline

bool cmin(t&a,const t&b)

using

namespace

std;

char ss[1

<<17],*a=ss,*b=ss;

inline

char gc()

template

inline

void sd(t&x)

char sr[1

<<21],z[20];int c=-1,z;

inline

void ot()

template

inline

void we(t x)

const

int n=5e4+5,inf=1e9;

typedef

int arr[n];

typedef

long

long ll;

struct mdyp[n];

struct eg

inline

void link(int u,int v)

inline

void clr(int t,eg*a)

}inline

void contraction(int&t,ll&val);

fp(i,1,tp)c[d[i].id]=i,d[i]=t[i];t=tp;

}inline

void reduction(int&t)

void cdq(int l,int r,int dep,ll val)

if(l==r)

fp(i,l,r)d[c[p[i].x]].w=-inf;

contraction(t,val);

fp(i,l,r)d[c[p[i].x]].w=inf;

reduction(t);

fp(i,1,t)e[dep+1][i]=d[i];

sum[dep+1]=t;int mid=(l+r)>>1;

cdq(l,mid,dep+1,val);

cdq(mid+1,r,dep+1,val);

}int main();

}fp(i,1,q)sd(p[i].x),sd(p[i].y);

sum[0]=m;cdq(1,q,0,0);

fp(i,1,q)we(ans[i]);

return ot(),0;

}

這題用線段樹分治竟然沒卡過看來窩常數還是太大了

2001 Hnoi2010 City 城市建設

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

CDQ分治 HNOI2010 城市建設

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

BZOJ2001 HNOI2010 城市建設

題目大意 動態最小生成樹,可以離線,每次修改後回答,點數20000,邊和修改都是50000。顧昱洲是真的神 顧昱洲 一類分治演算法 講的很妙,大致的幾個注意點在 裡面也有提到。include include include include include include define ll long...