HDOJ 1166 敌兵布阵

次元传送门

线段树裸题不解释

代码实现

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;

struct Line{
    int a,b,sum;
    Line *left,*right;

    Line(){
        a=b=sum=0;
        left=right=NULL;
    }

    int Add(int v[],int l,int r){
        a=l,b=r;
        if(l+1==r)
            return sum=v[l];
        else{
            int mid=(l+r)>>1;
            if(left==NULL)
                left=new Line;
            if(right==NULL)
                right=new Line;
            sum+=left->Add(v,l,mid);
            sum+=right->Add(v,mid,r);
            return sum;
        }
    }

    int CalcSum(int l,int r){
        if(l>=r)
            return 0;
        if(a==l&&b==r)
            return sum;
        else{
            int mid=(a+b)>>1;
            return left->CalcSum(l,min(mid,r))+right->CalcSum(max(mid,l),r);
        }
    }

    int Change(int pos,int val){
        if(a==pos&&b==pos+1)
            sum=val;
        else{
            int mid=(a+b)>>1;
            if(pos<mid)
                sum=left->Change(pos,val)+right->sum;
            else
                sum=left->sum+right->Change(pos,val);
        }
        return sum;
    }

    void Clear(void){
        if(left)left->Clear();
        if(right)right->Clear();
        sum=a=b=0;
    }

}Root;

const int N=50000;
int v[N],T,n;
string str;

int main(){//HDOJ 1166
    scanf("%d",&T);
    for(int c=1;c<=T;c++){
        Root.Clear();
        scanf("%d",&n);
        printf("Case %d:\n",c);
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        Root.Add(v,1,n+1);
        while(cin>>str&&str[0]!='E'){
            if(str[0]=='Q'){
                int x,y;
                scanf("%d%d",&x,&y);
                printf("%d\n",Root.CalcSum(x,y+1));
            }
            else if(str[0]=='A'){
                int pos,x;
                scanf("%d%d",&pos,&x); 
                Root.Change(pos,v[pos]=v[pos]+x);
            }
            else{
                int pos,x;
                scanf("%d%d",&pos,&x);
                Root.Change(pos,v[pos]=v[pos]-x);
            }
        }
    }
    return 0;
}//By YOUSIKI

By YOUSIKI

你可能感兴趣的:(HDOJ 1166 敌兵布阵)