1. 程式人生 > 實用技巧 >線段樹合併其它雜題

線段樹合併其它雜題

按照 這個題單 做的。

有一些單獨發了題解(前三題濃縮在了我的一篇文章中),在這裡就不說了。

準備填坑。

rot-tree (未做)

給每個點創造一個權值線段樹。點 $o $ 的線段樹代表以 \(o\) 為根的子樹的樹,有哪些值。

假設現在我們在線段樹合併階段,對於一個點,設它的兩個兒子是 \(o1\)\(o2\)\(o1\)\(o2\) 的線段樹中的點 \(l\sim r\),它的逆序對個數是多少?我們這樣討論:

  1. 左子樹的貢獻
  2. 右子樹的貢獻
  3. 跨過左右子樹的貢獻

對於1和2,我們遞迴求解。對於3,因為是權值線段樹,左邊子樹的值域肯定比右邊子樹的值域小,所以乘起來就是貢獻。即,如果不交換左右子樹,貢獻就是 ans1=tre[ o1右兒子 ].val X tre[ o2左兒子 ].val

,交換同理,貢獻為 ans2=...。合併完後,線段樹合併到它們那和藹可親的父親。ans1和ans2要取個min,加到總答案中。

談笑風生 (未做)

點 $o $ 的線段樹代表以 \(o\) 為根的子樹中的節點,深度是多少。然後對於點 \(o\) 的詢問,query(dep[o],dep[o]+k),以及fa=o的kth祖先;query(fa,fa[o]+k)。然後記得加上 \(c\) 的貢獻。

Dominant Indices (未做)

同blood cousins,線段樹多記一個最大值。

Tree Requests (未做)

值域線段樹?可能要邊合併邊處理……還沒想好。但是迴文串的條件是至多隻有一種字母是出現奇數次的。