注意到对于一个点而言,每一个操作本质是将某个值复制到另外一个点上。
考虑点分治,每次求出值到分治中心的后的贡献,即求出点最早到分治中心的时间 ,而后求出分治中心在 之后到其他子树的贡献。
考虑将每一个操作转为一条边,而后求出每一条边多久可以做出贡献,即求出 表示 操作最早连接到分治中心的时间,同时求出 表示 这个点的最早时间。 可以用双指针来求, 就是 的最早的边的 。
考虑什么情况下 会对 产生贡献。
显然,分治中心到 的第一级祖先 (即分治中心的儿子)的时间大于 且 在这个时间之后还可以转移到 。
考虑再来一遍 dfs,按照边的时间从大到小走(其实就是前向心),记录一个 为当前以及走到哪条边了以及 表示分治中心到 的时间,然后从 开始走,走的边的时间需要是递增的,就可以求出最大的时间 了。
然后就是求出对于每一个 ,大于等于 的 个数,然后再容斥掉同一子树的贡献即可。
以上是最后询问每个点的方法,但是询问呢?
考虑分治时,对于每一个询问操作枚举一遍,然后在 里面加上/减去
。当然, 的特判掉。
时间是 。注意还要将询问操作搞到点上去,否则复杂度还要乘个 。常数有点大。