给定一棵树,维护以下3个操作:
- 1 $x$表示如果节点$x$为白色,则将其染黑。否则对这个节点的所有儿子递归进行相同操作
- 2 $x$表示将以节点$x$为$root$的子树染白。
- 3 $x$表示查询节点$x$的颜色
考虑$1,3$操作。
如果考虑$w[x]$表示往下扩展的儿子,起始都是$-1$。
操作$1$就是把$w[i]+1$,对于操作$2$,就是考虑最大后缀和是否存在$\geq0$
而操作$2$就是清空,考虑把$w[x]=-1$,以及子树都变成$-1$。显然发现一个问题,如果$w[fa[x]]$很大就没办法,那么我们就把$w[x]=-\max{suf[x]}-1$,这样保证了合理性,也保证了实在性,仔细想想运用了树上差分的思想。
由于都是查询都是与根结点的$\max{suf},[1,dfn[x]]$,合并的时候就靠右转移,最大后缀就很舒服了。
代码
1 |
|