[Vijos 1512] SuperBrother打鼹鼠

题目描述:

有两个操作
1.在X,Y这个点上加上K的值
2.查询矩形 X1,Y1,X2,Y2的和

题目分析:

这题目真鬼畜。
二维线段树裸题…
但我搞的是BIT套线段树.
所以需要矩形割补一下

题目出现的错误:

1.少打了的%d,导致加入的权值成了随机数,Debug20min发现…
2.矩阵割补打错了…

题目链接:

Vijos 1512

AC 代码:

#include 
#include 
#define il inline
#define lowbit(x) x&-x
const int maxm=1e6+100;
int maxx=1100,maxy=1100;
int n;
struct T{
    struct node{
        int ls,rs;
        int sum;
    };
    node st[maxm<<1];
    int rt;
    int asksum(int &now,int l,int r,int ql,int qr)
    {
       if(!now) return 0;
       if(rqr) return 0;
       if(ql<=l&&r<=qr)
        return st[now].sum;
       int mid=(l+r)>>1;
       return asksum(st[now].ls,l,mid,ql,qr)+asksum(st[now].rs,mid+1,r,ql,qr);
    }
    void change(int &o,int l,int r,int ind,int num)
    {
        if(!o) o=++rt;
        if(l>=r)
        {
            st[o].sum+=num;
            return; 
        }
        int mid=(l+r)>>1;
        if(ind<=mid) change(st[o].ls,l,mid,ind,num);
        else change(st[o].rs,mid+1,r,ind,num);
        st[o].sum=st[st[o].ls].sum+st[st[o].rs].sum;
    }
}tree;
struct B{
    int root[maxm];
    int ask(int a,int b)
    {
        int ans=0;
        for(int i=a;i;i-=lowbit(i))
         ans+=tree.asksum(root[i],1,maxy,1,b);
        return ans;
    }
    void add(int x,int y,int val)
    {
        for(int i=x;i<=maxx;i+=lowbit(i))
         tree.change(root[i],1,maxy,y,val);
        //printf("%d %d\n",x,y);
    }
}BIT;
il int read()
{
    int x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*w;
}
int main()
{
    scanf("%d",&n);
    while(1)
    {
        int opt,a,b,c,d;
        scanf("%d",&opt);
        if(opt==1)
        {
            scanf("%d%d%d",&a,&b,&c);
            a++,b++;
            BIT.add(a,b,c);
        }
        if(opt==2)
        {
            a=read(),b=read(),c=read(),d=read();
            a++,b++,c++,d++;
            int ans1=BIT.ask(c,d);
            int ans2=BIT.ask(a-1,b-1);
            int ans3=BIT.ask(c,b-1);
            int ans4=BIT.ask(a-1,d);
            printf("%d\n",ans1+ans2-ans4-ans3);
        }
        if(opt==3) return 0;
    }
}

你可能感兴趣的:(题目分析,线段树,二维线段树,树套树)