给一个数组,每次对某个区间增加某个值,如何在线性时间内完成。
比如一个数组,刚开始都是0吧,如下表,第一行是下标:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
操作 1 3 5,代表给下标1-3的元素都加5,有很多次这样的操作。
正常来说,这个算法复杂度为n^2。
要实现线性时间,就只能通过某种记录方式,然后再通过记录,还原出最后的数据。
我们开辟一个csum数组,对每一波操作(left, right, value)有:
csum[left -1] -= value;
csum[right] += value;
然后对每一对三元操作都以同样的方式记录。
例如1 3 5操作完成后,csum数组为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-5 | 0 | 0 | 5 | 0 | 0 | 0 |