[ABC288D] Range Add Query

先考虑将原序列差分一下,事实上,我们对于这类每次可以操作一个区间减去固定值的时候,我们一般都需要差分,因为差分后,我们的操作实际上相当于 在差分序列上修改两个点,这个时候的问题是好考虑的。

这时候问题转化为,我们每次可以选择两个距离恰好为 \(k + 1\) 的点,将 \(l\) 加上 \(w\),将 \(l + k\) 减去 \(w\)

这个长度的限制很棘手,但是我们发现,对 $k \ \bmod $ 同余的点我们都可以相互转移到,这个是显然的。

那么如果想让最终的差分序列为全 \(0\),我们必须让所有下标同余的位置和为 \(0\)

细节上,对于 区间 \([l, r]\) 我们其实还有一种操作。对于同余于 \(r + 1\) 的点而言,我们可以全部转移到 \(r + 1\),并且由于我们要求只需要 \([l, r]\) 区间合法,所以实现上我们不需要考虑与 \(r + 1\) 同余的点。

事实上,当原序列真的全变成 \(0\) 时,\(l\) 处应该为 \(0 - w_{l - 1}\),所以对于同余 \(l\) 的也需要特殊处理。

时间复杂度 \(O(nk + qk)\)

code

posted @ 2023-11-16 23:20  Rainsheep  阅读(138)  评论(0编辑  收藏  举报