前缀和与差分
例子
有一数列d,包含元素的d0,d1,d2,d3...dn,每次选择任意的[L,R]范围的元素进行+1操作
代码
//输入参数为数列vector<int> seq,vector<vector<int>> range
vector<int> b(seq.size()+5,0);
for(int i=0;i<range.size();i++){
b[range[i][0]]+=1; //L
b[range[i][1]+1]-=1; //R+1
}
for(int i=1;i<b.size();i++){
b[i]+=b[i-1];
}
解释
- 数组b是用来记录数列d对应位置数字需要进行的操作。例如:b3=3,d3+=b3,d3需要加3
- 为什么要这样做呢?因为用暴力算法,每次选择操作都for循环数列进行+1操作,时间复杂度是O(n*m),次数一多就会超时
- 循环range数组只记录L和R+1,因为在后续的数组循环中,是利用前缀和求出最终的数组b。例如:三次都是选择[3,5]进行+1操作,那第一次循环后b3=3,b4=0,b5=0,b6=-3;第二次循环后,b3=3,b4=3,b5=3,b6=0