差分數組不僅僅是一個優秀的數據結構,還是一種很好的思想
差分數組的功能是修改區間,查詢點
修改區間的時間復雜度是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 }