[HDU 1166] 敌兵布阵
Posted youpeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HDU 1166] 敌兵布阵相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
一个线段树区间求和的模板题了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 #define MID(l,r) (l+r)>>1 7 #define lson root<<1 8 #define rson root<<1|1 9 10 const int maxn=5e4+5; 11 struct Tree 12 { 13 int l,r; 14 int sum; 15 }tree[maxn*3]; 16 17 int arr[maxn],ans; 18 19 void Build(int root,int l,int r) 20 { 21 tree[root].l=l; 22 tree[root].r=r; 23 if(l==r) 24 tree[root].sum=arr[l]; 25 else 26 { 27 int mid=MID(l,r); 28 Build(lson,l,mid); 29 Build(rson,mid+1,r); 30 tree[root].sum=tree[lson].sum+tree[rson].sum; 31 } 32 } 33 34 void Query(int root,int x,int y) 35 { 36 if(x<=tree[root].l&&y>=tree[root].r) 37 ans+=tree[root].sum; 38 else 39 { 40 int mid=MID(tree[root].l,tree[root].r); 41 if(x>mid) 42 { 43 Query(rson,x,y); 44 } 45 else if(y<=mid) 46 { 47 Query(lson,x,y); 48 } 49 else 50 { 51 Query(lson,x,y); 52 Query(rson,x,y); 53 } 54 } 55 } 56 57 void Update(int root,int x,int y) 58 { 59 tree[root].sum+=y; 60 if(tree[root].l==x&&tree[root].r==x) 61 return ; 62 int mid=MID(tree[root].l,tree[root].r); 63 if(x>mid) 64 Update(rson,x,y); 65 else 66 Update(lson,x,y); 67 68 } 69 70 int main() 71 { 72 int T; 73 cin>>T; 74 for(int flag=1;flag<=T;flag++) 75 { 76 int n; 77 cin>>n; 78 for(int i=1;i<=n;i++) 79 scanf("%d",&arr[i]); 80 Build(1,1,n); 81 printf("Case %d: ",flag); 82 char s[10]; 83 while(scanf("%s",s)!=EOF) 84 { 85 if(strcmp(s,"End")==0) 86 break; 87 else if(strcmp(s,"Add")==0) 88 { 89 int x,y; 90 scanf("%d%d",&x,&y); 91 Update(1,x,y); 92 } 93 else if(strcmp(s,"Sub")==0) 94 { 95 int x,y; 96 scanf("%d%d",&x,&y); 97 Update(1,x,-y); 98 } 99 else if(strcmp(s,"Query")==0) 100 { 101 int x,y; 102 scanf("%d%d",&x,&y); 103 ans=0; 104 Query(1,x,y); 105 printf("%d ",ans); 106 } 107 } 108 } 109 return 0; 110 }
以上是关于[HDU 1166] 敌兵布阵的主要内容,如果未能解决你的问题,请参考以下文章