模板——树状数组,单点查询,单点/区间修改
单点修改的题目为洛谷3374 树状数组模板一,其实和CodeVS 的线段树练习1 只有n和m的输入顺序和数据范围不一样。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<vector> 7 #include<cstdio> 8 #include<stack> 9 #include<queue> 10 #include<cmath> 11 #include<map> 12 #include<set> 13 using namespace std; 14 const int N=500100; 15 int n,m,val[N],t[N]; 16 void update(int x,int v){ 17 while(x<=n){ 18 t[x]+=v; 19 x+=x&(-x); 20 } 21 } 22 int getsum(int x){ 23 int res=0; 24 while(x>=1){ 25 res+=t[x]; 26 x-=x&(-x); 27 } 28 return res; 29 } 30 int main(){ 31 cin>>n>>m; 32 for(int i=1;i<=n;i++){ 33 scanf("%d",val+i); 34 update(i,val[i]); 35 } 36 while(m--){ 37 int p,x,y;scanf("%d%d%d",&p,&x,&y); 38 if(p==1){ 39 val[x]+=y; 40 update(x,y); 41 } 42 else if(p==2) 43 printf("%d\n",getsum(y)-getsum(x-1)); 44 } 45 return 0; 46 }
洛谷 Yukikaze 616ms
区间修改为洛谷3368 树状数组模板二。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<vector> 7 #include<cstdio> 8 #include<stack> 9 #include<queue> 10 #include<cmath> 11 #include<map> 12 #include<set> 13 using namespace std; 14 const int N=500010; 15 int n,m,val[N],t[N]; 16 void update(int x,int v){ 17 while(x<=n){ 18 t[x]+=v; 19 x+=x&(-x); 20 } 21 } 22 int sum(int x){ 23 int res=0; 24 while(x>0){ 25 res+=t[x]; 26 x-=x&(-x); 27 } 28 return res; 29 } 30 int main(){ 31 cin>>n>>m; 32 for(int i=1;i<=n;i++)scanf("%d",val+i); 33 while(m--){ 34 int op;scanf("%d",&op); 35 if(op==1){ 36 int x,y,v;scanf("%d%d%d",&x,&y,&v); 37 update(x,v); 38 update(y+1,-v); 39 } 40 else{ 41 int x;scanf("%d",&x); 42 printf("%d\n",val[x]+sum(x)); 43 } 44 } 45 return 0; 46 }
洛谷 Yukikaze 592ms

浙公网安备 33010602011771号