動態改邊權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...