LOJ dfs序1234
生活随笔
收集整理的這篇文章主要介紹了
LOJ dfs序1234
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DFS 序 1
題目要求:
① uuu節點權值+x+x+x
② 詢問uuu子樹權值和
- uuu節點權值+x+x+x :直接加
- uuu子樹權值和:dfs序+樹狀數組
LOJ提交代碼 DFS 序 1
DFS 序 2
題目要求:
① uuu節點子樹權值+x+x+x
② 詢問uuu子樹權值和
- uuu節點子樹權值+x+x+x:dfs序+區間修改
- 詢問uuu子樹權值和:dfs序+區間求和
區修+區改可以用2個樹狀數組或者lazy線段樹
LOJ提交代碼 DFS 序 2
DFS 序 3,樹上差分 1
題目要求:
① u?vu\leadsto vu?v 路徑+x+x+x
② 詢問uuu節點權值
③ 詢問uuu子樹權值和
采用自底向上的差分O(nlog?n)O(n\log n)O(nlogn):
- u?vu\leadsto vu?v路徑+x+x+x:uuu和vvv分別+x+x+x而LCA以及LCA的父親節點分別?x-x?x
- uuu節點權值:由于采用自底向上差分,不難得出原uuu節點的權值→\to→ uuu節點子樹權值和,采用dfs序+樹狀數組即可解決
- uuu子樹權值和:考慮uuu子樹一個節點vvv,經過操作二求法得知對于差分后節點vvv的值再求u?vu\leadsto vu?v的路徑上的實際點權值時(子樹),都會將vvv的貢獻加上即差分樹中vvv的值對子樹uuu權值和的貢獻即valv×(depv?depu+1)=valv×depv+(depu?1)×valvval_v×(dep_v-dep_u+1)=val_v×dep_v+(dep_u-1)×val_vvalv?×(depv??depu?+1)=valv?×depv?+(depu??1)×valv?于是有uuu子樹權值和為∑v∈Treeuvalv×depv?(depu?1)×∑v∈Treeuvalv\sum_{v\in Tree_u}val_v×dep_v-(dep_u-1)×\sum_{v\in Tree_u}val_vv∈Treeu?∑?valv?×depv??(depu??1)×v∈Treeu?∑?valv?由此得知只需要在用一個樹狀數組維護valv×depvval_v×dep_vvalv?×depv?即可根據dfs序求出子樹valv×depvval_v×dep_vvalv?×depv?和,不難得出uuu子樹權值和問題也迎刃而解
LOJ提交代碼 DFS 序 3
DFS 序 4
題目要求:
① uuu節點權值+x+x+x
② uuu節點子樹權值+x+x+x
③ 詢問u?vu\leadsto vu?v路徑節點權值和
對于u?vu\leadsto vu?v路徑權值和可以拆分成4條路徑:root?uroot\leadsto uroot?u,root?vroot \leadsto vroot?v,root?root \leadstoroot?LCA,root?root \leadstoroot?LCA的父親,于是只需要維護根節點到某個節點的權值和即可解決詢問
于是我們讓每個節點的權值為到根節點的權值和
- uuu節點權值+x+x+x:此操作會導致uuu子樹中所有節點到根節點的權值和+x+x+x,因此需要讓uuu節點子樹權值都+x+x+x
- uuu節點子樹權值+x+x+x:考慮uuu子樹中一個節點vvv,不難得知u?vu\leadsto vu?v路徑上所有點都會讓vvv節點權值+x+x+x即vvv節點需要增加x×(depv?depu+1)=x×depv?x×(depu?1)x×(dep_v-dep_u+1)=x×dep_v-x×(dep_u-1)x×(depv??depu?+1)=x×depv??x×(depu??1)不難發現?x×(depu?1)-x×(dep_u-1)?x×(depu??1)可以直接子樹修改即可而x×depvx×dep_vx×depv?說明每一個xxx對當前節點權值增加x×depvx×dep_vx×depv?,只需要用一個樹狀數組記錄一下每個點最終有多少xxx即可。
LOJ提交代碼 DFS 序 4
總結
以上是生活随笔為你收集整理的LOJ dfs序1234的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces1486 F. Pa
- 下一篇: HDU5126 stars(4维偏序->