差分数组的功能是修改区间,查询点
修改区间的时间复杂度是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];
下面给出有一个完整的实现代码:
1 //aininot260 2 //修改区间,查询点 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 const int maxn=100005; 7 const int maxq=100005; 8 int a[maxn]; 9 int b[maxn]; 10 int n,q; 11 void update(int x,int y,int z) 12 { 13 b[x]+=z; 14 b[y+1]-=z; 15 } 16 int sum(int x) 17 { 18 int ans=0; 19 for(int i=1;i<=x;i++) 20 ans+=b[i]; 21 return ans; 22 } 23 int main() 24 { 25 cin>>n; 26 for(int i=1;i<=n;i++) 27 cin>>a[i]; 28 b[1]=a[1]; 29 for(int i=2;i<=n;i++) 30 b[i]=a[i]-a[i-1]; 31 cin>>q; 32 while(q--) 33 { 34 int x; 35 cin>>x; 36 if(x==1) 37 { 38 int y,z,w; 39 cin>>y>>z>>w; 40 update(y,z,w); 41 } 42 if(x==2) 43 { 44 int y; 45 cin>>y; 46 cout<<sum(y)<<endl; 47 } 48 } 49 return 0; 50 }
原文地址:https://www.cnblogs.com/aininot260/p/9304521.html
时间: 2024-11-03 01:11:12