计蒜客 斑点蛇

  解析

  线段树点操作版题,注意范围判断。

  代码

  

#include<bits/stdc++.h>
#define MAXN 50004
using namespace std;

int s_tree[4*MAXN];
int n;

void up(int p)
{
    s_tree[p]=s_tree[p*2]+s_tree[p*2+1];
}

void modify(int p,int l,int r,int x,int v,int flag)
{
    if(l==r)
    {
        if(flag==1)
        {
            s_tree[p]+=v;
            return;
        }
        else 
        {
            s_tree[p]-=v;
            return;
        }
    }
    int mid=(l+r)/2;
    if(x<=mid) modify(p*2,l,mid,x,v,flag);
    else modify(p*2+1,mid+1,r,x,v,flag);
    up(p);
}

int query(int p,int l,int r,int x,int y)
{
    if(x<=l&&r<=y)//范围判断
    {
        return s_tree[p];
    }
    int res=0;
    int mid=(l+r)/2;
    if(x<=mid) res+=query(p*2,l,mid,x,y);
    if(y>mid) res+=query(p*2+1,mid+1,r,x,y);
    return res;
}

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        modify(1,1,n,i,a,1);
    }
    string st;
    int sa,sb;
    while(cin>>st)
    {
        if(st=="End") break;
        cin>>sa>>sb;
        if(st=="Query")
        {
            cout<<query(1,1,n,sa,sb)<<endl;
        }
        else if(st=="Add") 
        {
            modify(1,1,n,sa,sb,1);
        }
        else if(st=="Sub")
        {
            modify(1,1,n,sa,sb,0);
        }
    }
    return 0;
}

 

posted @ 2018-07-25 14:48  前排吃瓜  阅读(175)  评论(0编辑  收藏  举报