前缀和与差分

例子

有一数列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];
}

解释

  1. 数组b是用来记录数列d对应位置数字需要进行的操作。例如:b3=3,d3+=b3,d3需要加3
  2. 为什么要这样做呢?因为用暴力算法,每次选择操作都for循环数列进行+1操作,时间复杂度是O(n*m),次数一多就会超时
  3. 循环range数组只记录L和R+1,因为在后续的数组循环中,是利用前缀和求出最终的数组b。例如:三次都是选择[3,5]进行+1操作,那第一次循环后b3=3,b4=0,b5=0,b6=-3;第二次循环后,b3=3,b4=3,b5=3,b6=0
posted @ 2020-09-20 12:12  肥斯大只仔  阅读(108)  评论(0编辑  收藏  举报