hdu 2642

这又是一个简单的二维树状数组的题目,题目很好,很简洁。开始时星星都不亮,每个坐标的星星只能是1或0,1代表亮,0代表灭就行了;

所以如果这个星星已经是亮的了,就没必要再让它操作“亮”;如果这个星星已经是灭的了,也没必要执行 “灭”的操作了。

还是要注意数组的下标从1开始,那是必须的,呵呵!

还有输入的x1 x2 大小可能不是正常的,要判断一下,y1  y2同理;

代码如下: 模版不用动的,早就背下来了!

#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
const int maxn=1006;
int tree[maxn][maxn];
int lowbit(int t)
{
    return t & (-t);
}

void update(int x,int y,int val)
{
    for(int i=x;i<=maxn;i+=lowbit(i))
        for(int j=y;j<=maxn;j+=lowbit(j))
     tree[i][j]+=val;
}


int query(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 get_val(int i,int j) //获得1个单个位置的值 1 或0
{

    int ans=query(i,j)-query(i-1,j)-query(i,j-1)+query(i-1,j-1);
    return ans;


}

int main()
{
    int m,x,y,ans;
    int x1,x2,y1,y2;
    char s[2];
    cin>>m;
    memset(tree,0,sizeof(tree));
    while(m--)
    {
     scanf("%s",s);
     if (s[0]=='B')
         {
          scanf("%d%d",&x,&y);
          x++;y++;
          if (get_val(x,y)==0)
          update(x,y,1);

         }
    if (s[0]=='Q')
    {
          scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
          if (x1>x2) swap(x1,x2);
          if (y1>y2) swap(y1,y2);
          x1++;x2++;y1++;y2++;
          ans=query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1);
          printf("%d\n",ans);

    }
    if (s[0]=='D')
    {
          scanf("%d%d",&x,&y);
          x++;y++;
          if (get_val(x,y)==1)
          update(x,y,-1);

 

    }

    }


    //cout << "Hello world!" << endl;
    return 0;
}

posted @ 2012-09-21 19:07  兴安黑熊  阅读(233)  评论(0编辑  收藏  举报