BZOJ3730 震波 動態點分治

2022-05-03 16:09:23 字數 2262 閱讀 2014

在一片土地上有n個城市,通過n-1條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為1,其中第i個城市的價值為value[i]。

不幸的是,這片土地常常發生**,並且隨著時代的發展,城市的價值也往往會發生變動。

0 x k 表示發生了一次**,震中城市為x,影響範圍為k,所有與x距離不超過k的城市都將受到影響,該次**造成的經濟損失為所有受影響城市的價值和。

1 x y 表示第x個城市的價值變成了y。

第一行包含兩個正整數n和m。

第二行包含n個正整數,第i個數表示value[i]。

接下來n-1行,每行包含兩個正整數u、v,表示u和v之間有一條無向邊。

接下來m行,每行包含三個數,表示m次操作。

$1\leq n,m\leq 100000$

$1\leq u,v,x\leq n$

$1\leq value[i],y\leq 10000$

$0\leq k\leq n-1$

包含若干行,對於每個詢問輸出一行乙個正整數表示答案。

動態點分治裸題……

今天終於弄清楚動態點分治是啥玩意了……就是用資料結構爬點分樹,大致感覺其實跟樹鏈剖分差不多?(依稀記得我貌似還有個紫荊花之戀的大坑?!)

這題用rmqlca+線段樹隨便維護一下就好了……

ps:我寫的st表求lca+線段樹跑了1600ms……卡常數の不能……orzlhx樹狀陣列+神秘優化跑了543ms

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 2147483647

8#define eps 1e-9

9using

namespace

std;

10 typedef long

long

ll;11

struct

edgea[200001

];14

struct

nodet[20000001

];17

int n,m,op,u,v,x,y,s,rt,ans=0,tot=0,tim=0,cnt=0,num[100001],f[100001],rt1[100001],rt2[100001],head[100001],mx[100001],dep[100001],siz[100001],dfn[100001],st[200001][18],lg[200001

];18

bool used[100001

];19

void add(int u,int

v)24

void updata(int l,int r,int &u,int p,int

x)32

int query(int l,int r,int u,int

p)39

int getdis(int u,int

v)47

void dfs(int u,int fa,int

dpt)57}

58}59void getrt(int u,int

fa)69

}70 mx[u]=max(mx[u],s-mx[u]);

71if(mx[u]u;72}

73void getn(int u,int fa,int

ls)83}84

}85void divide(int

u)97}98

}99void lhx_ak_ioi(int u,int

k)104 num[u]=k;

105}

106int lhx_ak_noi(int u,int

k)112

return

ret;

113}

114int

main()

123 dfs(1,0,1

);124 lg[0]=-1

;125

for(int i=1;i<=tim;i++)lg[i]=lg[i>>1]+1

;126

for(int i=1;(1

<)

130}

131 mx[rt=0]=inf;

132 s=n;

133 getrt(1,0

);134

divide(rt);

135for(int i=1;i<=m;i++)else

lhx_ak_ioi(x,y);

142}

143return0;

144 }

BZOJ3730 震波 動態點分治

include include include include include include define space putchar define enter putchar n using namespace std typedef long long ll template void rea...

bzoj 3730 震波 動態樹分治

給出一棵樹,點有點權,每次詢問距離乙個點不超過k kk 100000 n le100000 n 1000 00把點分樹建出來,然後對每個分治中心用樹狀陣列維護到該點距離為定值的點權和,以及到他點分樹上父親距離為定值的點權和。查詢的時候每次沿著父親往上跳,在計算當前點貢獻時需要減去上乙個點所在子樹的貢...

bzoj3730 震波 動態樹分治

第一行包含兩個正整數n和m。第二行包含n個正整數,第i個數表示value i 接下來n 1行,每行包含兩個正整數u v,表示u和v之間有一條無向邊。接下來m行,每行包含三個數,表示m次操作。包含若干行,對於每個詢問輸出一行乙個正整數表示答案。這道題是動態樹分治的模板題。簡要的思路 先建出分治樹,每次...