线段树模板 hdu 敌兵布阵

来源:互联网 发布:java判断文件是否存在 编辑:程序博客网 时间:2024/06/04 00:32

 

 

#include<stdio.h>#include<string.h>#define N 50005int num[N];struct node{int L;int R;int sum;}list[N*4];void build(int k,int x,int y){list[k].L = x;list[k].R = y;if( list[k].L == list[k].R ) {list[k].sum = num[list[k].L];return;}int mid = (x+y)>>1;build(k<<1,x,mid);build(k<<1|1,mid+1,y);list[k].sum = list[k<<1].sum + list[k<<1|1].sum ;}int find(int k,int x,int y){int ans;if(list[k].L == x && list[k].R == y){ans = list[k].sum ;return ans;}int mid = (list[k].L + list[k].R )>>1;if(x<=mid && y<=mid) find(k<<1,x,y);else if(x>mid && y>mid) find(k<<1|1,x,y);else {ans = find(k<<1,x,mid) + find(k<<1|1,mid+1,y);return ans;}}void update(int k,int x,int y){if(list[k].L == x && list[k].R ==x){list[k].sum = y;return ;}int mid = (list[k].L + list[k].R )>>1;if(x<=mid) update(k<<1,x,y);else update(k<<1|1,x,y);list[k].sum = list[k<<1].sum + list[k<<1|1].sum ;}int main(){int t;int i;int n;int a,b;char str[10];scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&num[i]);build(1,1,n);while(scanf("%s",str),strcmp(str,"End")){scanf("%d%d",&a,&b);if(strcmp(str,"Query")==0) printf("%d\n",find(1,a,b));else if(strcmp(str,"Add")==0) update(1,a,num[a]+=b);else if(strcmp(str,"Sub")==0) update(1,a,num[a]-=b);}}return 0;}


 再来一个树状数组的。

 

#include<stdio.h>#include<string.h>#define N 50005int a[N],c[N];int n,r = 1;int lowbit(int x){return x&-x;}void update(int k,int x){while(k<=n){c[k] += x;k+=lowbit(k);}}int sum(int x){int ans=0;while(x>0){ans += c[x];x-=lowbit(x);}return ans;}int main(){int t,i;int a1,a2;char str[25];scanf("%d",&t);while(t--){scanf("%d",&n);memset(c,0,sizeof(c));for(i=1;i<=n;i++){scanf("%d",&a[i]);update(i,a[i]);}printf("Case %d:\n",r++);while(scanf("%s",str),strcmp(str,"End")){scanf("%d%d",&a1,&a2);if(strcmp(str,"Query")==0) printf("%d\n",sum(a2)-sum(a1-1));else if(strcmp(str,"Add")==0) a[a1]+=a2,update(a1,a2);else if(strcmp(str,"Sub")==0) a[a1]-=a2,update(a1,-a2);}}return 0;}


 

原创粉丝点击