标签:des style blog http color os io strong
Description
Input
Output
Sample Input
Sample Output
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<stdlib.h> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 struct node //节点结构体 9 { 10 int l,r; 11 int num; 12 }a[250000]; 13 int ans; 14 void contree(int l,int r,int now) //创建线段树 15 { 16 a[now].l=l; 17 a[now].r=r; 18 if(l==r) //如果l==r,说明没有子节点了,那么此时为单个营地,输入人数 19 { 20 scanf("%d",&a[now].num); 21 return ; 22 } 23 int mid=(a[now].l+a[now].r)/2; 24 contree(l,mid,now<<1); //递归左子树 25 contree(mid+1,r,now<<1|1); //递归右子树 26 a[now].num=a[now<<1].num+a[now<<1|1].num; 27 } 28 void addtree(int l,int r,int now,int vis,int val) //更新线段树 29 { 30 if(l==r&&l==vis) 31 { 32 a[now].num+=val; 33 return ; 34 } 35 int mid=(a[now].l+a[now].r)/2; 36 if(vis>mid) 37 addtree(mid+1,r,now<<1|1,vis,val); 38 if(vis<=mid) 39 addtree(l,mid,now<<1,vis,val); 40 a[now].num=a[now<<1].num+a[now<<1|1].num; //每次更改某个值的时候,被查找过的数的值也要更新,这点很重要 41 } 42 void sumtree(int l,int r,int now,int L,int R) //查询线段树 43 { 44 if(L<=l&&r<=R) 45 { 46 ans+=a[now].num; 47 return ; 48 } 49 int mid=(a[now].l+a[now].r)/2; 50 if(L>mid) 51 sumtree(mid+1,r,now<<1|1,L,R); 52 else if(R<=mid) 53 sumtree(l,mid,now<<1,L,R); 54 else 55 { 56 sumtree(l,mid,now<<1,L,R); 57 sumtree(mid+1,r,now<<1|1,L,R); 58 } 59 } 60 int main() 61 { 62 int kase,n,cnt=0; 63 scanf("%d",&kase); 64 while(kase--) 65 { 66 scanf("%d",&n); 67 contree(1,n,1); 68 printf("Case %d:\n",++cnt); 69 while(1) 70 { 71 getchar(); 72 string str; 73 cin>>str; 74 int x,y; 75 ans=0; 76 if(str=="End") 77 break; 78 scanf("%d %d",&x,&y); 79 if(str=="Query") 80 { 81 sumtree(1,n,1,x,y); 82 printf("%d\n",ans); 83 } 84 else if(str=="Add") 85 addtree(1,n,1,x,y); 86 else 87 addtree(1,n,1,x,-y); 88 } 89 } 90 return 0; 91 }
HDU 1166 敌兵布阵(线段树),布布扣,bubuko.com
标签:des style blog http color os io strong
原文地址:http://www.cnblogs.com/clliff/p/3893559.html