樹上啟發式合併(dsu on tree)學習筆記【理解+模板+例題】
一、理解
先從一個典型的例題開始,樹的每個節點都有一個顏色,求某個節點v的子樹中顏色c的個數。暴力的話,就是對於每一個節點都統計一下子樹中顏色c的個數,複雜度為。現在,我們來優化。可以發現我們做了很多重複的工作,如果能利用一些工作的結果那就好了。這裡要引入輕/重兒子的思想(好像就是輕重鏈,樹鏈剖分。。。。),可以證明從整棵樹的根節點到樹中任意一點的路徑上最多有 條輕邊。(相關定義及證明請參考部落格:https://www.cnblogs.com/zwfymqz/p/9683124.html)。所以我們把重兒子的貢獻儲存,每次暴力計算輕兒子以及自己的貢獻即可。每個輕兒子最多會被暴力列舉次,所以時間複雜度為。
二、模板
基本套路就是,對於u的子樹:
1、計算所有輕兒子v的答案,不儲存。
2、計算重兒子son[u]的答案,並儲存貢獻。
3、暴力計算本節點u及所有輕兒子v對答案的貢獻。
4、加上重兒子son[u]的貢獻,得到該子樹u的答案。
5、如果u不是其父親的重兒子,即不需要儲存貢獻,清除其子樹的貢獻。
這種題一定要轉化為考慮每個節點的子樹對答案的影響,如果是詢問就轉化為對子樹的詢問。
三、例題
3、SGU 507 Treediff 題解
相關文章
- dsu on tree (樹上啟發式合併) 詳解
- 樹上啟發式合併
- 樹上啟發式合併-附有例題CF600E
- 樹上啟發式合併總結
- CodeForces 600E Lomsat gelral (樹上啟發式合併模板)
- 【學習筆記】線段樹合併 & 分裂筆記
- 珂朵莉樹(Chtholly Tree)學習筆記筆記
- DSU on Tree
- LevelDB 學習筆記2:合併筆記
- 線段樹合併 筆記筆記
- 啟發式合併
- 【學習筆記】Segment Tree Beats/吉司機線段樹筆記
- 學習筆記:樹與圖上的計數問題筆記
- 《筆記》之學習高併發筆記
- JAVA 學習併發筆記(一)Java筆記
- (一)Java併發學習筆記Java筆記
- 【題解】Solution Set - NOIP2024集訓Day12 樹上啟發式合併
- KD-Tree 學習筆記筆記
- [學習筆記] 樹上差分 - 圖論筆記圖論
- 三路合併 —— Git 學習筆記 17Git筆記
- 【Go學習筆記11】併發(一)Go筆記
- Go 併發concurrency 學習筆記Go筆記
- Link Cut Tree學習筆記筆記
- [學習筆記] 動態開點權值線段樹合併 - 資料結構筆記資料結構
- 平衡樹學習筆記筆記
- 支配樹學習筆記筆記
- 平衡樹 學習筆記筆記
- [Link-Cut-Tree]【學習筆記】筆記
- *衡樹 Treap(樹堆) 學習筆記筆記
- 伸展樹(Splay)學習筆記筆記
- 點分樹學習筆記筆記
- 「學習筆記」重修左偏樹筆記
- 線段樹學習筆記筆記
- Link-Cut Tree(LCT) 模板總結 & 水題/模板題 動態樹
- 【批處理學習筆記】第十九課:字串合併筆記字串
- 【演算法學習筆記】生成樹問題探究演算法筆記
- 【學習筆記】組合數學筆記
- 組合數學學習筆記筆記