在一片土地上有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次操作。包含若干行,對於每個詢問輸出一行乙個正整數表示答案。這道題是動態樹分治的模板題。簡要的思路 先建出分治樹,每次...