【题解】CF1017G The Tree 树形结构 动态链分治 (有待思考?)

题目链接

考虑没有操作 \(2\)

若没有操作 \(2\) ,那么可以发现对于操作 \(1\) ,操作顺序对节点颜色不影响。

考虑点 \(u\) 在某个时刻是黑色。

那么一定存在一个祖先 \(x\) ,满足祖先 \(x\to u\) 点这条链,每个点都是黑色,且祖先 \(x\) 在某个时刻被进行若干次 \(1\) 操作。

那么这条链上的点都被染色的充分必要条件即:对于任意前缀 \(u\to v\) ,前缀的操作次数大于等于点数。

考虑一个转化:

对于序列 \(a[]\) ,对于能够取到最大后缀和的一个后缀 \(a[:idx]\) ,除了最后一个位置外,一定满足对于该子段的任意一个位置的前缀和大于等于 \(0\)

因此最大后缀和是满足除了最后一个位置外,一定满足对于该子段的任意一个位置的前缀和大于等于 \(0\) 的且最后一个位置的前缀和最大可取到的的值。

那么因此可以考虑令所有点点权默认 \(-1\) ,若点 \(u\) 到根节点的这条链的最大后缀和大于等于 \(0\) ,则说明该点是黑色。

\(query(u)\) 为点 \(u\) 到根节点的这条链的最大后缀和,\(fa(u)\) 为节点 \(u\) 的父亲。

考虑如何处理操作 \(2\)

对于一次操作 \(2\ x\) 我们可以将其等价于:将子树内的所有操作清空,并在 \(x\) 和其父节点中插入若干个 “假点” (即让祖先上的操作作用中假点上) 。

假点的个数即执行所有祖先操作对子树内影响的层数,也即 \(query(fa(x))\)

那么剩下的问题就可以 \(O(n\log ^2 n)\) 的时间内解决了。

代码记录

posted @ 2021-09-23 10:18  Themaxmaxmax  阅读(25)  评论(0编辑  收藏  举报