【模板】树状数组 2

匿名 (未验证) 提交于 2019-12-02 23:49:02

5 5 1 5 4 2 3 1 2 4 2 2 3 1 1 5 -1 1 3 5 7 2 4
6 10

故输出结果为6、10

【解题思路】

这题也是一道很不错的题目,是一道区间修改,单点查询的树状数组(单点修改区间查询)改编

这道题利用了差分数组的思想,差分数组就是记录后一个数减去前一个数记录在差分数组中(即为程序中的ADD)

这样区间修改(l,r)时即可在l上加上修改值,r+1上减去修改值即可

单点查询即可直接查询即可

【code】

 1 // luogu-judger-enable-o2  2 #include <cstdio>  3 #include <iostream>  4 #include <algorithm>  5 using namespace std;  6 int n,m;  7 int a[500005],c[500005];  8 inline int lowbit(int x){  9     return x&(-x); 10 } 11 inline int GetSum(int x){ 12     int ans=0; 13     for(register int i=x;i!=0;i-=lowbit(i)) 14         ans+=c[i]; 15     return ans; 16 } 17 inline void Add(int x,int y){ 18     for(register int i=x;i<=n;i+=lowbit(i)) 19         c[i]+=y; 20     return ; 21 } 22 int main(){ 23     //freopen("3368.in","r",stdin); 24     //freopen("3368.out","w",stdout); 25     scanf("%d%d",&n,&m);  26     for(register int i=1;i<=n;i++){ 27         scanf("%d",&a[i]); 28         Add(i,a[i]-a[i-1]); 29     } 30     int x,y,z,k; 31     for(register int i=1;i<=m;i++){ 32         scanf("%d",&x); 33         if(x==1){ 34             scanf("%d%d%d",&y,&z,&k); 35             Add(y,k); 36             Add(z+1,-k); 37         } 38         if(x==2){ 39             scanf("%d",&y);  40             printf("%d\n",GetSum(y)); 41         } 42     } 43     return 0; 44 }

Finished

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!