HDU-1166 敌兵布阵 线段树|树状数组

来源:互联网 发布:java开源微信商城 编辑:程序博客网 时间:2024/05/17 02:28

        题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

        题意很简单~略

        思路:纯粹的单点更新,线段树的入门题,当然,树状数组也很方便。

        My code:

            线段树版:

//STATUS:C++_AC_171MS_956KB  #include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<math.h>#include<map>#include<set>using namespace std;#define LL __int64#define pii pair<int,int>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int MAX=50010,INF=200000000;const double esp=1e-6;void build(int l,int r,int rt);void update(int l,int r,int rt);void query(int l,int r,int rt);int num[MAX],sum[MAX*4];int T,n,a,b,ans;int main(){//freopen("in.txt","r",stdin);int i,k=1;char op[10];scanf("%d",&T);while(T--){printf("Case %d:\n",k++);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&num[i]);build(1,n,1);while(scanf("%s",op) && op[0]!='E'){scanf("%d%d",&a,&b);if(op[0]!='Q'){if(op[0]=='S')b=-b;update(1,n,1);}else {ans=0;query(1,n,1);printf("%d\n",ans);}}}return 0;}void build(int l,int r,int rt){if(l==r){sum[rt]=num[l];return;}int mid=(l+r)>>1;build(lson);build(rson);sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void update(int l,int r,int rt){sum[rt]+=b;if(l==r)return;int mid=(l+r)>>1;if(a<=mid)update(lson);else update(rson);}void query(int l,int r,int rt){if(a<=l && r<=b){ans+=sum[rt];return;}int mid=(l+r)>>1;if(a<=mid)query(lson);if(b>mid)query(rson);}

      树状数组版:

//STATUS:C++_AC_156MS_632KB  #include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<math.h>#include<map>#include<set>using namespace std;#define LL __int64#define pii pair<int,int>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int MAX=50010,INF=200000000;const double esp=1e-6;int num[MAX],c[MAX];int T,n,a,b;int lowbit(int x){return x&(-x);}void update(int i){while(i<=n){c[i]+=b;i+=lowbit(i);}}int sum(int i){int s=0;while(i){s+=c[i];i-=lowbit(i);}return s;}int main(){//freopen("in.txt","r",stdin);int i,k=1;char op[10];scanf("%d",&T);while(T--){printf("Case %d:\n",k++);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);num[i]+=num[i-1];}for(i=1;i<=n;i++)c[i]=num[i]-num[i-lowbit(i)];while(scanf("%s",op) && op[0]!='E'){scanf("%d%d",&a,&b);if(op[0]!='Q'){if(op[0]=='S')b=-b;update(a);}else printf("%d\n",sum(b)-sum(a-1));}}return 0;}


原创粉丝点击