目录
前缀和
差分数组
性质
例题:
前缀和
前缀和主要适用场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。
差分数组
性质
当我们需要更新区间[l,r]时候(仅指加减运算),我们仅仅可以只更新d[l]+=x,d[r+1]-=x;
视频
星垂月朦胧 UP主
例题:
#include <iostream>
using namespace std;
#include<vector>int main()
{// 请在此输入您的代码long N,Q;cin >> N >> Q;string s;cin>>s;// 差分数组vector<int> v(N+1,0);for(int i =0; i<Q;i++){long l,r,k;cin >>l>>r>>k;v[l-1] += (k%26);v[r] -= (k%26);}// 前缀和for(int i=1; i<N;i++){v[i] = v[i-1] + v[i] ; }for(int i =0;i<N;i++){int offset = s[i] - 'a';offset = (offset + v[i]) %26;s[i] = offset +'a';}// 暴力解法过不了// for(int i =0; i<Q;i++){// int l,r,k;// cin >>l>>r>>k;// // cout<<s<<" ";// // string tmp(s);// for(int j=l-1;j<r;j++){// // s[j]+=k;// // s[j] = 'a' + (s[j] - 'a' + k ) % 26;// if ((s[j] - 'a' + k ) > 26){// s[j] = 'a' + (s[j] - 'a' + k ) % 26;// }else{// s[j]+=k;// }// }// // cout<<tmp<<" ";// // cout<<s<<endl;// }cout<<s;return 0;
}