【Codeforces 1149C】Tree Generator™

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\))。

用线段树维护这个就好了。

啊啊啊上推操作烦死人啊

猜你喜欢

转载自www.cnblogs.com/denverjin/p/10810456.html