P10776 Jabby's shadows 题解
赖今羿
·
·
题解
题意
维护一棵树,有非负边权,每个点初始为黑色,需要支持:
- 查询 u 所在同色连通块的直径;
- 将路径 (u,v) 染成黑色/白色。
## 题解
讲一个通用 Top Tree 做法,可以单 log 做此题同时可以支持 Link、Cut 等操作。
考虑 SATT,假设没有路径染色操作,我们大致需要维护以下信息:
- 这个点的颜色:`nco`;
- 这条边的权值:`val`;
- 两个端点的颜色:`col[0/1]`;
- 簇路径长度:`len`;
- 簇路径上点的颜色是否全部相同:`peq`;
- 两个界点到其所在白/黑色连通块内最远点距离:`dis[0/1][0/1]`;
- 两个界点所在白/黑色连通块的直径:`ans[0/1][0/1]`;
如果有路径染色操作,我们还需要维护以下信息:
- 簇路径被全部染成白/黑色后的 dis:`cds[0/1][0/1][0/1]`;
- 簇路径被全部染成白/黑色后的 ans:`cas[0/1][0/1][0/1]`;
- 染色标记:`tag`;
那么路径染色时直接将 `ans` 和 `dis` 赋值为对应的 `cas` 和 `cds` 即可。
因为 Pushdown 很简单,接下来我们考虑如何 Pushup。
为了方便进行细节讨论,我们再明确一下一些词的定义:
> 对于同时维护点和边的 SATT,以上界点为例,若当前簇内深度最小的是一条边,那么上界点实际定义为与这条边相连的深度更小的点,是在簇外的;否则定义为簇内深度最小的点。
>
> 而对于端点,以上端点为例,它被定义为簇内深度最小的点。
>
> 那么就可以区分“端点”和“界点”:端点一定是在簇内的,界点不一定是在簇内。比如对于一条边的基簇,它没有端点,并且两个界点都在簇外。
那么可以看出,无论是 Compress 还是 Rake,这些信息都是可以快速合并的,以 `dis` 和 `ans` 为例:
- 在 Rake 时:
- 上界点的 dis 可以来自两个簇的 dis;
- 下界点的 dis 可以来自原 dis 或跨过上界点延伸到另一个簇中;
- 上界点的 ans 可以来自两个簇的 ans,还可以跨过界点;
- 下界点的 ans 可以来自原 ans 或者跨过上界点延伸到另一个簇中,或者另一个簇的 ans;
- 在 Compress 时:
- 上界点的 dis 可以来自上面的簇的 dis 或者延伸到下面的簇;
- 上界点的 ans 可以来自上面的簇的 ans 或者当上面的簇路径颜色相同时,下面的簇的 ans 或跨过界点。
其实没什么细节,最主要就是维护的信息比较多而已……
## 代码
完整代码见 [link](https://www.cnblogs.com/laijinyi/p/18728202#jabbys-shadows)。
## 闲话
这题我写了三天
我也不知道我为什么要学这么没用的科技。