「咕咕網校 - 基礎省選」樹上問題的進階 by Drench
阿新 • • 發佈:2018-09-06
相等 所有 開始 異或和 給定 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