怎麼這麼唐詩的 DS 都做不出來啊

Alexande發表於2024-10-18

雖然下蛋爺和紅黑樹都沒做出來。

description

你有一顆有根樹,有三種操作:

  • \(x\) 子樹內深度為 \(k\) 的所有點 \(+s\) 並求出最大值。
  • \(x\) 子樹內深度 \(\le k\) 的所有點 \(+s\) 並求出最大值。
  • \(x\) 子樹內所有點 \(+s\) 並求出最大值。

規定:子樹內,子樹的根節點深度為 \(0\)

\(1 \le k \le 10\)

solution

確實自己蠻唐的。

考慮這麼一件事情,我對於每個點 \(x\) 維護 \(x\) 子樹 \(10\) 層以內所有的按照 BFS 序順序的值,也就是對於每一層維護一個線段樹,發現一個事情,我對於 \(1, 2\) 操作,只會對 \(x\)\(k\) 級祖先的線段樹進行更改,這個複雜度大概是 \(O(k^2)\) 的,雖然但是能過去就好了。然後考慮子樹 \(+s\) 怎麼維護,本質上就是我們打上一個 \(tag\),表示將所有點的所有線段樹都進行更改,只有 \(x\)\(k\) 級祖先不是全部更改,但是發現最大值可能不太好維護,讓我想想。

哦本質上我還可以維護一個 DFS 序,再對每個點維護一個子樹最大值,對於一個結點的更改資訊,我們直接跳祖先即可,時間複雜度是 \(\log^2 n\) 的,相當於我又給祖先打上了一個 \(tag\),BFS 序維護的是每個點內部的線段樹,而 DFS 序維護的是每個點打 \(tag\) 的線段樹,發現樹鏈剖分既可以維護鏈又可以維護子樹,相當於兩個 \(tag\) 都可以用同一個線段樹進行操作。

等等我好像只對祖先做了更改,沒對子樹內部點做更改。沒關係我每次更改可以暴力把 \(x\)\(k\) 級祖先的值對其進行一次 \(tag\) 覆蓋,不過有很多細節要考慮。

相關文章