1 条题解
-
0
题目描述
给定一个 个点的树。
称一条树边 关于区间 是好的,当且仅当存在 ,使得编号 的点在树上的简单路径经过了 。
定义一个区间 的权值为关于 好的树边数量。
有 次询问,每次询问给出 ,你需要回答满足 的所有区间 的权值和。
对于 的数据,满足 。
题目解法
考虑 关于 好的条件,转化为 子树内有 之间的点且 并不是 本身或其祖先,其中后面条件可以容斥掉,只需要减去询问区间的所有子区间 深度和即可。
现在计算单个区间权值转化为两个问题:区间 深度,有多少个子树内有该区间之间的点。
- 区间 深度。
即解决询问区间子区间 深度和,考虑扫描右端点,维护所有左端点对应 深度,并维护历史和。
对于一个当前的右端点 ,其所有左端点的对应 一定在一条链上,那么加入 时,将 与这条链的最低点也就是 取 ,将那些比这个 还深的对应 都改成这个 ,更浅的不变,可以直接实现区间覆盖区间历史和,也可以每次暴力修改一段左端点区间的对应 ,实现区间加区间历史和,修改次数均摊线性。这一部分是 的。
- 有多少个子树内有该区间之间的点
考察一个点 不计入 答案的时候,将 子树内点按编号排序,那么这个 一定是介于两个编号排序后相邻的点之间的,可以抽象成矩形加。
考虑树上启发式合并,对每个子树维护一个 set 或一棵平衡树之类,内部存子树内点的编号,每次把小子树的某点合并到大子树里的时候,将大子树对应平衡树中该点编号前驱后继取出,并将这个矩形加终止,换用新的两个矩形加。
问题变为 次矩形加,询问即为矩形查询,可以在 的时间内得到解决。
综上,整个问题在 的时间内得到解决。
信息
- ID
- 915
- 时间
- 3000~4000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 7
- 已通过
- 1
- 上传者