1. 程式人生 > >「咕咕網校 - 基礎省選」樹上問題的進階 by Drench

「咕咕網校 - 基礎省選」樹上問題的進階 by Drench

相等 所有 開始 異或和 給定 through ren 遍歷map ued

一定要在noip之前把自己花錢買的Luogu網課梳理完!QAQ

樹上前綴和:

對於有根樹,在每個點記錄 val (點權) 和 sum(到根的點權之和)

當然記錄的值因題而異(但是既然叫樹上前綴和當然就要這麽定義啊)

就可以做一些奇奇怪怪的操作了。

還是看題來理解這玩意兒的妙用吧2333

EG1

給定樹和各點點權,t次詢問,每次求u到v路徑上的點權和。(1e5)

是道板子題了。

從根開始dfs,到每個點時記錄該點的val和sum

其中sum為該點到祖先路徑上點權之和,包括自己。

每次輸出sum[u]+sum[v]-2*sum[lca(u,v)]+val[lca(u,v)]。

EG2

給定初始點權為0的樹,n次操作,每次對u,v路徑上每點+x。
求最後每點點權。(1e5)

運用差分思想。

對每個點記錄一個val值,初始為0。

對於每次操作:

技術分享圖片

這樣,每個點的真實點權就是該點的子樹點權和。

val[u]+=x;
val[v]+=x;
val[lca(u,v)]-=x;
if(fa[lca(u,v)]!=lca[u,v])
fa[lca(u,v)]-=x;

實現O(4)修改,最後用O(n)得到答案。

“經典的樹上差分。”——ddd

EG3

給定樹,邊有邊權。
求有多少對(u,v)使u,v路上所有邊的邊權異或和為0(1e5)
其中異或和=所有數異或起來的結果

記sum[x]為x到祖先的異或和。

由於異或有:

a xor a = 0

所以如下圖,在sum[u] xor sum[v]時,lca以上的屎色線已經被消掉了。

技術分享圖片

所以ans=sum[u] xor sum[v]

問題轉化為:有1e5個數(sum),求中間有多少對數異或和=0

也就是有多少對相等的數。

用一個map記錄,然後遍歷map就行了。

————————————

to be continued

「咕咕網校 - 基礎省選」樹上問題的進階 by Drench