HDU 2642 Stars

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;

}

 

你可能感兴趣的:(tar)