标签:最大 啊啊啊 必须 生成 上推 公式 codeforce 交换 区间
题意:给一个括号序列,这个括号序列可以生成一棵树:
(
:生成一个新的节点,放到当前节点的儿子处。
)
:走到当前节点的父亲。
现在有\(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?
标签:最大 啊啊啊 必须 生成 上推 公式 codeforce 交换 区间
原文地址:https://www.cnblogs.com/denverjin/p/10810456.html