首页 > 其他 > 详细

线段树专题

时间:2015-02-19 20:43:58      阅读:355      评论:0      收藏:0      [点我收藏+]

hdu 1166 敌兵布阵

单点更新,区间查询和。

http://acm.hdu.edu.cn/showproblem.php?pid=1166

#define rd(x) scanf("%d",&x)
#define rd2(x,y)  scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=50010;

struct ST
{
    int l,r;
    int sum;
}st[maxn<<2];

void pushUp(int i)
{
    st[i].sum=st[i<<1].sum+st[(i<<1)|1].sum;
}

void build(int i,int l,int r)
{
    st[i].l=l;
    st[i].r=r;
    if(st[i].l==st[i].r)
    {
        rd(st[i].sum);
        return;
    }
    int mid=(st[i].l+st[i].r)>>1;
    build(i<<1,l,mid);
    build((i<<1)|1,mid+1,r);
    pushUp(i);
}

void add(int i,int p,int val)
{
    if(st[i].l==st[i].r)
    {
        st[i].sum+=val;
        return;
    }
    int mid=(st[i].l+st[i].r)>>1;
    if(p<=mid)
        add(i<<1,p,val);
    else
        add((i<<1)|1,p,val);
    pushUp(i);
}

int query(int i,int L,int R)
{
    if(st[i].l==L&&st[i].r==R)
    {
        return st[i].sum;
    }
    int mid=(st[i].l+st[i].r)>>1;
    if(R<=mid)
        return query(i<<1,L,R);
    else if(L>mid)
        return query((i<<1)|1,L,R);
    else
        return query(i<<1,L,mid)+query((i<<1)|1,mid+1,R);
}
int n;
char cm[10];

int main()
{
    int cas=1;
    int t;rd(t);
    while(t--)
    {
        printf("Case %d:\n",cas++);
        rd(n);
        build(1,1,n);
        while(scanf("%s",cm))
        {
            if(cm[0]=='Q')
            {
                int l,r;
                rd2(l,r);
                printf("%d\n",query(1,l,r));
            }
            else if(cm[0]=='A')
            {
                int p,val;
                rd2(p,val);
                add(1,p,val);
            }
            else if(cm[0]=='S')
            {
                int p,val;
                rd2(p,val);
                add(1,p,-val);
            }
            else
                break;
        }
    }
    return 0;
}


 

线段树专题

原文:http://blog.csdn.net/sr_19930829/article/details/43883395

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!