[数据结构:差分数组]
差分数组不仅仅是一个优秀的数据结构,还是一种很好的思想
差分数组的功能是修改区间,查询点
修改区间的时间复杂度是O(1),查询点的时间复杂度为O(n)
我们这里要根据数据范围灵活选取方法,不要拘泥于差分数组
void update(int x,int y,int z) { b[x]+=z; b[y+1]-=z; }
以上是修改区间操作,x位置加上修改量,y+1位置减去修改量,这样整个区间的元素就相当于修改了
int sum(int x) { int ans=0; for(int i=1;i<=x;i++) ans+=b[i]; return ans; }
刚才方便了,但是查询的时候就需要全部都加一遍了
还有就是预处理的时候
b[1]=a[1]; for(int i=2;i<=n;i++) b[i]=a[i]-a[i-1];
下面给出有一个完整的实现代码 :
//aininot260 //修改区间,查询点 #include<iostream> #include<cstring> using namespace std; const int maxn=100005; const int maxq=100005; int a[maxn]; int b[maxn]; int n,q; void update(int x,int y,int z) { b[x]+=z; b[y+1]-=z; } int sum(int x) { int ans=0; for(int i=1;i<=x;i++) ans+=b[i]; return ans; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; b[1]=a[1]; for(int i=2;i<=n;i++) b[i]=a[i]-a[i-1]; cin>>q; while(q--) { int x; cin>>x; if(x==1) { int y,z,w; cin>>y>>z>>w; update(y,z,w); } if(x==2) { int y; cin>>y; cout<<sum(y)<<endl; } } return 0; }