P7735 [NOI2021] 轻重边 题解

发布时间 2023-12-10 15:57:41作者: Creeper_l

是一道树剖好题,之前听 lsl 讲过一点,于是很快就做出来了。

题意:有一个 \(n\) 个节点的树,最开始的时候所有边都是轻边,维护两个操作:

  • 操作一:将 \(u\)\(v\) 的路径中经过的所有点的邻边变为轻边,再将这条路径上的边变为重边。

  • 操作二:求出 \(u\)\(v\) 这条路径上有多少条重边。

首先我们会发现一个性质,如果一条边是重边,当且仅当这条边的相邻两个点在同一次操作一被操作。因为如果不是的话,它一定没有被操作过或者被变为轻边。

那么看到这种性质我们就可以想到把每一个点染上一个颜色,这个颜色就是它被操作时的次数 \(i\),如果一条边的两个端点颜色相同的话,该边即为重边。

所以问题就变为了区间修改,区间查询有多少个相邻且相等的数对,线段树维护即可,注意查询跳链的时候要看两条链的相邻端点是否相等。

最开始的时候将每个点赋值为互不相同的负数即可。