1. 程式人生 > >【Codeforces 1149C】Tree Generator?

【Codeforces 1149C】Tree Generator?

tree def 想要 spa 每次 公式 上推 inline 父親

Codeforces 1149 C

題意:給一個括號序列,這個括號序列可以生成一棵樹:

(:生成一個新的節點,放到當前節點的兒子處。

):走到當前節點的父親。

現在有\(q\)次操作,每次交換兩個括號的值,問樹直徑。

思路:首先我們放松條件,只求樹的高。

那麽我們走過這個括號序列會經過\(2n-1\)個點。

我們只要求這些點的深度的最大值即可。

這就是一個前綴最大值。

可以用線段樹輕易維護。

現在可以再進一步,考慮直徑。

我們知道樹上距離公式\(dep_u+dep_v-2dep_{lca}\)

在我們走過的\(2n-1\)個點中,兩個點的\(lca\)肯定在它們中間。

(因為我們從\(u\)

走到\(v\)必定經過它們的\(lca\)

我們還知道它們的\(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?