P7735 [NOI2021] 轻重边 题解
是一道树剖好题,之前听 lsl 讲过一点,于是很快就做出来了。
题意:有一个 \(n\) 个节点的树,最开始的时候所有边都是轻边,维护两个操作:
-
操作一:将 \(u\) 到 \(v\) 的路径中经过的所有点的邻边变为轻边,再将这条路径上的边变为重边。
-
操作二:求出 \(u\) 到 \(v\) 这条路径上有多少条重边。
首先我们会发现一个性质,如果一条边是重边,当且仅当这条边的相邻两个点在同一次操作一被操作。因为如果不是的话,它一定没有被操作过或者被变为轻边。
那么看到这种性质我们就可以想到把每一个点染上一个颜色,这个颜色就是它被操作时的次数 \(i\),如果一条边的两个端点颜色相同的话,该边即为重边。
所以问题就变为了区间修改,区间查询有多少个相邻且相等的数对,线段树维护即可,注意查询跳链的时候要看两条链的相邻端点是否相等。
最开始的时候将每个点赋值为互不相同的负数即可。
本文作者:Creeper_l
本文链接:https://www.cnblogs.com/Creeperl/p/17892754.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步