码迷,mamicode.com
首页 > 其他好文 > 详细

【Codeforces 1149C】Tree Generator?

时间:2019-05-05 01:08:50      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:最大   啊啊啊   必须   生成   上推   公式   codeforce   交换   区间   

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?

标签:最大   啊啊啊   必须   生成   上推   公式   codeforce   交换   区间   

原文地址:https://www.cnblogs.com/denverjin/p/10810456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!