洒水器

  • k-领域乘
  • 单点查

首先可以想到维护一个 \(tag_{x,i}\) 表示对子树内距离 \(\leq x\) 的点的贡献,之后由于没有逆元,我们有一种办法是乘的时候不给在 \(u\) 方向的子树乘,这个用 \(bfs\) 序维护出领域,线段树区间改一下,复杂度是 \(O(n d^2 \log n)\),过不了的。

考虑假装它有逆元怎么做,那么我们考虑什么地方会算重,发现对于 \(tag_{fa_u,d}\) 来说,\(tag_{u,d+1}\) 会被多算一次 \(w\),给这个地方乘个逆元就行。

但是先再没有的话考虑怎么做,有个高妙的方法是,直接改写状态,设 \(tag_{x,i}\) 表示这个标记会给子树内距离 $ = x$ 的点贡献。

令起点为 \(x\),领域为 \(d\)。

之后考虑从下往上的过程,考虑 \(u->fa_u\) 的过程,此时对于非 \(u\) 子树内的修改恰好为 \(d-dis(fa_u,x)\) 的就是 \(tag\) 直接乘上 \(w\),对于 \(u\) 子树内的点注意到距离 \(u\) 的距离为 \(d-dis(fa_u,x)\) 的没有被任何标记覆盖到,于是给这个标记也乘上 \(w\) 即可。

正确性和复杂度显然都正确。

怎么想到的?首先你只想要这条链上一个满足要求的点贡献且必须是直接贡献而不通过一些逆元操作,转成恰好是比较合适的。其次考虑我们乘逆元相当于的依据是对于 \((u,d+1)\) 的标记得到贡献时,一定会对 \((fa_u,d)\) 的标记得到贡献,这是可以类比的,所以标记改变定以后转移会变得简单。

posted @ 2026-09-14 20:13  lmy333  阅读(12)  评论(0)    收藏  举报