洛谷 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)。
浙公网安备 33010602011771号