hdu1166线段树单点更新

来源:互联网 发布:windows能开发ios吗 编辑:程序博客网 时间:2024/06/08 19:26

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

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=50005;int sum[maxn<<2];//4倍void pushup(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){    if(l==r)    {        scanf("%d",&sum[rt]);        return ;    }    int m=(l+r)>>1;    build(l,m,rt<<1);    build(m+1,r,rt<<1|1);    pushup(rt);}void update(int p,int add,int l,int r,int rt){    if(l==r)    {        sum[rt]+=add;        return ;    }    int m=(l+r)>>1;    if(p<=m)//注意等号    update(p,add,l,m,rt<<1);    else    update(p,add,m+1,r,rt<<1|1);    pushup(rt);}int search(int ll,int rr,int l,int r,int rt){    if(ll<=l&&rr>=r)    {        return sum[rt];    }    int m=(l+r)>>1;    int ans=0;    if(ll<=m)//注意等号    ans+=search(ll,rr,l,m,rt<<1);    if(rr>m)    ans+=search(ll,rr,m+1,r,rt<<1|1);    return ans;}int main(){int t,c;    char d[10];    scanf("%d",&t);    for (c=1;c<=t;c++)    {        printf("Case %d:\n",c);        int n;        scanf("%d",&n);        build(1,n,1);        while(scanf("%s",d)!= EOF)        {            if(d[0]=='E') break;            int x,y;            scanf("%d%d",&x,&y);            if(d[0]=='Q')            {                int ans=search(x,y,1,n,1);                printf("%d\n",ans);            }            if(d[0]=='S') update(x,y,1,n,1);            if(d[0]=='A') update(x,y,1,n,1);        }    }    return 0;}

树状数组做法

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN=50005;int n;int f[MAXN];int lowbit(int x){    return x&(-x);}void add(int x,int value)//数组改值{    while(x<=n)    {        f[x]+=value;        x+=lowbit(x);    }}int sum(int x)//数组前x项和{    int ret=0;    while(x>0)    {        ret+=f[x];        x-=lowbit(x);    }    return ret;}int getsum(int x1,int x2){    return sum(x2)-sum(x1-1);}int main(){int t; int a,b; int num; char s[15]; cin>>t; for(int k=1;k<=t;k++) {     printf("Case %d:\n",k);     scanf("%d",&n);     memset(f,0,sizeof(f));     for(int i=1;i<=n;i++)     {         scanf("%d",&num);         add(i,num);     }     while(scanf("%s",s))     {         if(s[0]=='E')         break;         scanf("%d%d",&a,&b);         if(s[0]=='A')         add(a,b);         if(s[0]=='S')         add(a,-b);         if(s[0]=='Q')         printf("%d\n",getsum(a,b));     } }    return 0;}
0 0
原创粉丝点击