http://acm.hdu.edu.cn/showproblem.php?pid=2642

裸二维树状数组,没有秒杀,坑点是这题的询问是x1,x2,y1,y2(其实题目说得清清楚楚,惯性思维害死人?写完不过sample无力吐槽)。

然后犯了一个巨2的笔误,死活没查出来,还是让路人王同学看出来的、、、、跪了

View Code
#include <iostream>
using namespace std;
const int MAX=1010;
int vis[MAX][MAX],tree[MAX][MAX];
int lowbit(int i)
{
    return i&(-i);
}
void update(int x,int y,int val)
{
    for(int i=x;i<MAX;i+=lowbit(i))
        for(int j=y;j<MAX;j+=lowbit(j))
            tree[i][j]+=val;
}
int Sum(int x,int y)
{
    int sum=0;
    for(int i=x;i>0;i-=lowbit(i))
        for(int j=y;j>0;j-=lowbit(j))
            sum+=tree[i][j];
    return sum;
}
int main()
{
    int M;
    scanf("%d",&M);
    while(M--)
    {
        char op[2];
        scanf("%s",op);
        int x1,y1,x2,y2;
        switch(op[0])
        {
            case 'B':
            {
                scanf("%d%d",&x1,&y1);
                x1++;y1++;
                if(!vis[x1][y1])
                {
                    update(x1,y1,1);
                    vis[x1][y1]=1;
                }
                break;
            }
            case 'D':
            {
                scanf("%d%d",&x1,&y1);
                x1++;y1++;
                if(vis[x1][y1])
                {
                    update(x1,y1,-1);
                    vis[x1][y1]=0;
                }
                break;
            }
            case 'Q':
            {
                int minx,miny,maxx,maxy;
                scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
                x1++;y1++;x2++;y2++; 
                minx=min(x1,x2);
                miny=min(y1,y2);
                maxx=max(x1,x2);
                maxy=max(y1,y2);
                printf("%d\n",Sum(maxx,maxy)+Sum(minx-1,miny-1)-Sum(minx-1,maxy)-Sum(maxx,miny-1));
                break;
            }
        }
    }
    return 0;
}