hdu 1166 敌兵布阵

来源:互联网 发布:是故教然后知困 编辑:程序博客网 时间:2024/05/16 07:33

树状数组:

#include<stdio.h>#include<string.h>using namespace std;int n,a[500010];char sh[500];int lowbit(int i){return i&(-i);}int sum(int i){int sum=0;while(i>0){sum+=a[i];i-=lowbit(i);}return sum;}void update(int i,int val){while(i<=n){a[i]+=val;i+=lowbit(i);}}int main(){int val,m,i,j,k,x,y,t,z=1;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&val);update(i,val);}printf("Case %d:\n",z++);while(scanf("%s",sh)!=EOF){if(sh[0]=='E') break;scanf("%d %d",&x,&y);if(sh[0]=='A') update(x,y);else if(sh[0]=='S') update(x,-y);else printf("%d\n",sum(y)-sum(x-1));}}return 0;}

线段树:

#include<stdio.h>#include<string.h>using namespace std;struct Tree{int l,r,mid;int  sum;}tree[150010];char commend[30];int ai[50020];void build(int i,int a,int b){tree[i].l=a;tree[i].r=b;tree[i].mid=(a+b)/2;tree[i].sum=0;if(a==b)tree[i].sum=ai[a];else{build(2*i,a,(a+b)/2);build(2*i+1,(a+b)/2+1,b);tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;}}void update(int i,int a,int b,int c){if(a==tree[i].l&&b==tree[i].r){tree[i].sum+=c;return;}if(b<=tree[i].mid)    update(2*i,a,b,c);    else if(tree[i].mid<a)    update(2*i+1,a,b,c);    else    {    update(2*i,a,tree[i].mid,c);    update(2*i+1,tree[i].mid+1,b,c);    }    tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;}int query(int i,int a,int b){if(a<=tree[i].l&&tree[i].r<=b)return tree[i].sum;if(b<=tree[i].mid)return query(2*i,a,b);else if(tree[i].mid<a)return query(2*i+1,a,b);else return query(2*i,a,tree[i].mid)+query(2*i+1,tree[i].mid+1,b);}int main(){int t,n,m,i,j,k,a,b,c,z=1;scanf("%d",&t);while(t--){scanf("%d",&n);printf("Case %d:\n",z++);for(i=1;i<=n;i++){scanf("%d",&ai[i]);}build(1,1,n);while(scanf("%s",commend)!=EOF){if(commend[0]=='E') break;else if(commend[0]=='A'){scanf("%d%d",&a,&c);update(1,a,a,c);}else if(commend[0]=='S'){scanf("%d%d",&a,&c);update(1,a,a,-c);}else if(commend[0]=='Q'){scanf("%d%d",&a,&b);printf("%d\n",query(1,a,b));}}}return 0;}


0 0
原创粉丝点击