先考虑将原序列差分一下,事实上,我们对于这类每次可以操作一个区间减去固定值的时候,我们一般都需要差分,因为差分后,我们的操作实际上相当于 **在差分序列上修改两个点**,这个时候的问题是好考虑的。
这时候问题转化为,我们每次可以选择两个距离恰好为 $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](https://atcoder.jp/contests/abc288/submissions/47624981)
标签:Add,差分,Range,ABC288D,序列,Query,我们,同余 From: https://www.cnblogs.com/Rainsheep/p/17837532.html