码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1166 敌兵布阵

时间:2016-10-07 07:38:25      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

题目地址

线段树,单点更新

#include<cstdio>
#include<algorithm>
using namespace std;
const int Nmax = 50005;
int num[Nmax];
int n;

struct Node
{
    int l;
    int r;
    int data;
}tree[Nmax*4];

void init()
{
    for(int i=0;i<Nmax*4;i++)
        tree[i].l=tree[i].r=tree[i].data=0;
}

void push_up(int root)
{
    tree[root].data=tree[root<<1].data+tree[root<<1|1].data;
}


void build(int root,int l,int r)
{
    tree[root].l=l;
    tree[root].r=r;
    if(l==r)
    {
        tree[root].data=num[l];
        return;
    }
    if(l<r)
    {
        int mid=(l+r)>>1;
        build(root*2,l,mid);
        build(root*2+1,mid+1,r);
        push_up(root);
    }
}

void update(int root,int l,int r,int data)
{
    if(tree[root].l==l && tree[root].r == r)
    {
        tree[root].data+=data;
        return;
    }
    int mid=(tree[root].l+tree[root].r)>>1;
    if(mid<l)
        update(root<<1|1,l,r,data);
    else if(mid>=r)
        update(root<<1,l,r,data);
    else
    {
        update(root<<1,l,mid,data);
        update(root<<1|1,mid+1,r,data);
    }
    push_up(root);
}

int query(int root,int l,int r)
{
    if(tree[root].l>=l && tree[root].r<=r)
        return tree[root].data;
    int mid=(tree[root].l+tree[root].r)>>1;
    int ans=0;
    if(mid<l)
        ans+=query(root<<1|1,l,r);
    else if(mid>=r)
        ans+=query(root<<1,l,r);
    else
        ans+=query(root<<1,l,mid)+query(root<<1|1,mid+1,r);
    return ans;
}
char s[10];

int main()
{
    int t;
    //freopen("in.in","r",stdin);
    scanf("%d",&t);
    for(int k=1;k<=t;k++)
    {
        printf("Case %d:\n",k);
        scanf("%d",&n);
        init();
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        build(1,1,n);
        /*int test=query(1,2,2);
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++)
            {
                printf("%d->%d:%d\n",i,j,query(1,i,j));
            }
        */

        //printf("%d\n",query(1,2,6));
        /*for(int i=1;i<=26;i++)
        {
            if(tree[i].data)
                printf("num:%d , left:%d , right:%d , data:%d\n",i,tree[i].l,tree[i].r,tree[i].data);

        }*/
        while(1)
        {
            scanf("%s",s);
            if(s[0]==E)
                break;
            int x,y;
            scanf("%d%d",&x,&y);
            if(s[0]==A)
            {
                update(1,x,x,y);
            }
            else if(s[0]==S)
            {
                update(1,x,x,-y);
            }
            else
            {
                printf("%d\n",query(1,x,y));
            }
        }
    }
    return 0;
}

 

HDU 1166 敌兵布阵

标签:

原文地址:http://www.cnblogs.com/BBBob/p/5935319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!