【Codeforces 1149C】Tree Generator?
阿新 • • 發佈:2019-05-05
tree def 想要 spa 每次 公式 上推 inline 父親 走到\(v\)必定經過它們的\(lca\)啊
Codeforces 1149 C
題意:給一個括號序列,這個括號序列可以生成一棵樹:
(
:生成一個新的節點,放到當前節點的兒子處。
)
:走到當前節點的父親。
現在有\(q\)次操作,每次交換兩個括號的值,問樹直徑。
思路:首先我們放松條件,只求樹的高。
那麽我們走過這個括號序列會經過\(2n-1\)個點。
我們只要求這些點的深度的最大值即可。
這就是一個前綴最大值。
可以用線段樹輕易維護。
現在可以再進一步,考慮直徑。
我們知道樹上距離公式\(dep_u+dep_v-2dep_{lca}\)。
在我們走過的\(2n-1\)個點中,兩個點的\(lca\)肯定在它們中間。
(因為我們從\(u\)
我們還知道它們的\(lca\)是它們中間的點中最深的。
(因為如果想要往下走必須新建節點
所以我們要求的就是所有的\((l,r)\)區間中最大的\(dep_l+dep_r-2dep_i(l\le i\le r)\)
這個可以分兩種情況處理(因為一下弄一個區間實在太難搞了
第一是\(dep_l-2dep_i\),二是\(dep_r-2dep_i\),這樣就可以在加上另一邊(保證大(小)於等於\(i\)的)的\(l\)(\(r\))。
用線段樹維護這個就好了。
啊啊啊上推操作煩死人啊
【Codeforces 1149C】Tree Generator?