stars

hdoj 2642

解决:二维树状数组简单

最后的时候,必须判断下x与a,y与b的关系,若x>a或者y>b将无法处理

#include <iostream>

#include <algorithm>

using namespace std;

const int N=1001;

//一个是树状数组,一个是状态标记

int c[N+5][N+5];

bool s[N+5][N+5];

int m;

inline int lowbit(int x)

{

    return x&(-x);

}

inline void update(int x,int y,int inc)

{

    for(int i=x;i<=N;i+=lowbit(i))

     for(int j=y;j<=N;j+=lowbit(j))

     c[i][j]+=inc;

}

inline int getsum(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+=c[i][j];

    return sum;

}

int main()

{

    scanf("%d",&m);

    char cmd;

    int x,y,a,b;

    while(m--)

    {

        getchar();

        scanf("%c",&cmd);

        if(cmd=='B')

        {

            scanf("%d%d",&x,&y);

            if(s[x+1][y+1]==0)

            {

                s[x+1][y+1]=1;

                update(x+1,y+1,1);

            }

        }

        else if(cmd=='D')

        {

            scanf("%d%d",&x,&y);

            if(s[x+1][y+1]==1)

            {

                s[x+1][y+1]=0;

                update(x+1,y+1,-1);

            }

        }

        else 

        {

            scanf("%d%d%d%d",&x,&a,&y,&b);

            if(x>a)swap(x,a);

            if(y>b)swap(y,b);

            printf("%d\n",getsum(a+1,b+1)-getsum(a+1,y)-getsum(x,b+1)+getsum(x,y));

        }

    }

    system("pause");

    return 0;

}

 

 

 

你可能感兴趣的:(tar)