题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
代码:
普通线段树
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 int tree[250000]; 5 int m; 6 void pushup(int rt) 7 { 8 tree[rt]=tree[rt<<1]+tree[rt<<1|1]; 9 } 10 void csh(int l,int r,int rt) 11 { 12 if(l==r) 13 { 14 scanf("%d",&tree[rt]); 15 return ; 16 } 17 else 18 { 19 int m=(l+r)>>1; 20 csh(l,m,rt<<1); 21 csh(m+1,r,rt<<1|1); 22 pushup(rt); 23 } 24 } 25 void update(int k,int c,int l,int r,int rt) 26 { 27 if(l==r) 28 { 29 tree[rt]+=c; 30 return ; 31 } 32 int m=(l+r)>>1; 33 if(k<=m) 34 update(k,c,l,m,rt<<1); 35 else 36 update(k,c,m+1,r,rt<<1|1); 37 pushup(rt); 38 } 39 int query(int L,int R,int l,int r,int rt) 40 { 41 if(L <= l && r <= R) 42 { 43 return tree[rt]; 44 } 45 int m=(l+r)>>1; 46 int ans=0; 47 if(L <= m) 48 ans+=query(L,R,l,m,rt<<1); 49 if(R > m) 50 ans+=query(L,R,m+1,r,rt<<1|1); 51 return ans; 52 } 53 int main() 54 { 55 int jishu; 56 cin>>jishu; 57 for(int kk=1; kk<=jishu; kk++) 58 { 59 int n; 60 scanf("%d",&n); 61 csh(1,n,1); 62 char ch[20]; 63 printf("Case %d:\n",kk); 64 while(scanf("%s",ch)) 65 { 66 if(ch[0]=='E') 67 break; 68 else 69 { 70 int a,b; 71 scanf("%d%d",&a,&b); 72 if(ch[0]=='Q') 73 cout<<query(a,b,1,n,1)<<endl; 74 else 75 { 76 if(ch[0]=='A') 77 { 78 update(a,b,1,n,1); 79 } 80 else 81 update(a,b*-1,1,n,1); 82 } 83 } 84 } 85 } 86 }
zkw线段树
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 int tree[250000]; 5 int m; 6 void csh(int n) 7 { 8 memset(tree,0,sizeof(tree)); 9 m=1; 10 while(m<=n) m<<=1; 11 for(int i=m+1;i<=m+n;i++) scanf("%d",&tree[i]); 12 for(int i=m-1;i>=0;i--) 13 tree[i]=tree[i<<1]+tree[i<<1|1]; 14 } 15 void updata(int n,int v) 16 { 17 int kk=m+n; 18 tree[kk]+=v; 19 kk>>=1; 20 while(kk>=1) 21 { 22 tree[kk]+=v; 23 kk>>=1; 24 } 25 } 26 int query(int s,int r) 27 { 28 29 int ans = 0; 30 for(s = m + s - 1, r = m + r + 1; s ^ r ^ 1; s >>= 1, r >>= 1) 31 { 32 if(~s&1) ans += tree[s^1]; 33 if(r&1) ans += tree[r^1]; 34 } 35 return ans; 36 37 } 38 int main() 39 { 40 int jishu; 41 cin>>jishu; 42 for(int kk=1; kk<=jishu; kk++) 43 { 44 int n; 45 scanf("%d",&n); 46 csh(n); 47 char ch[20]; 48 printf("Case %d:\n",kk); 49 while(scanf("%s",ch)) 50 { 51 52 if(ch[0]=='E') 53 break; 54 else 55 { 56 int a,b; 57 scanf("%d%d",&a,&b); 58 if(ch[0]=='Q') 59 cout<<query(a,b)<<endl; 60 else 61 { 62 if(ch[0]=='A') 63 { 64 updata(a,b); 65 } 66 else 67 updata(a,b*-1); 68 } 69 } 70 } 71 } 72 }