洛谷 P4458

P4458

标签 线段树

因为查询给定的是路径长度的范围,所以对于每个长度都要维护答案。

将修改操作改为 \([1, v]\)\(d\),考虑对长度为 \(len\) 的贡献(算出与长度为 \(len\) 的与 \([1, r]\) 的交集之和即可)。分 \(len < v, len \ge v\) 讨论(设左端点为 \(r\)):

  • \(len < v\),对于 \(len \le r < v\),交集均为 \(len\)。对于 \(r \ge v\),交集为 \(v, v - 1, v- 2 \dots\)。总共 \(len(v - len) + v(v + 1) / 2\)
  • \(len \ge v\),则 \(r \ge v\),交集为 \(len, len - 1, len - 2, \dots\)。总共 \(len(len + 1) / 2\)

但是有一个问题,需要满足 \(r \le n\),把 \(r = n + 1, n + 2 \dots\) 减掉即可(对于两种情况是一样的),交集为 \(v- (n + 1 - len), v - (n + 2 + len), \dots\)。发现这些东西拆开就是区间加 \(k_0, k_1 \cdot len, k_2 \cdot len^2\),用线段树维护即可。

时间复杂度:\(O(m \log n)\)。常数较大。

为了减小常数,x += y 没有写取模,而是写的 (x >= mod) && (x -= Mod)。没有发现 \(y\) 可能 \(< 0\),还要加一句 (x < 0) && (x += Mod)

posted @ 2025-11-20 22:12  xiehanrui0817  阅读(0)  评论(0)    收藏  举报