HDU 1166 敌兵布阵(线段树维护点)

传送门

中文题,而且也都说的很明白了。

就是一个裸的线段树,也没什么说的了。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 5e4+10;
int a[maxn],tree[maxn*4];
void Build(int p,int l,int r)
{
    if(l == r)
    {
        tree[p] = a[l];
        return;
    }
    int mid = (l + r) / 2;
    Build(p * 2,l,mid);
    Build(p * 2 + 1,mid + 1,r);
    tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
void Change(int p,int l,int r,int x,int num)
{
    if(l == r)
    {
        tree[p] += num;
        return;
    }
    int mid = (l + r) / 2;
    if(x <= mid)
        Change(p * 2,l,mid,x,num);
    else
        Change(p * 2 + 1,mid + 1,r,x,num);
    tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
int Query(int p,int l,int r,int L,int R)
{
    int ans = 0;
    if(L <= l && R >= r)
        return tree[p];
    int mid = (l + r) / 2;
    if(R <= mid)
        return Query(p * 2,l,mid,L,R);
    if(L > mid)
        return Query(p * 2 + 1,mid + 1,r,L,R);
    return Query(p * 2,l,mid,L,mid) + Query(p * 2 + 1,mid + 1,r,mid+1,R);
}
int main()
{
    int t,cas = 1;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i = 1;i <= n; i++)
            scanf("%d",&a[i]);
        Build(1,1,n);
        printf("Case %d:\n",cas++);
        char s[15];
        while(~scanf("%s",s))
        {
        if(s[0] == 'Q')
        {
            int l,r,ans;
            scanf("%d %d",&l,&r);
            ans = Query(1,1,n,l,r);
            printf("%d\n",ans);
        }
        else if(s[0] == 'A' || s[0] == 'S')
        {
            int x,num;
            scanf("%d %d",&x,&num);
            if(s[0] == 'S')
                num = -num;
            Change(1,1,n,x,num);
        }
        else if(s[0] == 'E')
            break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao__hei__hei/article/details/87898432