这又是一个简单的二维树状数组的题目,题目很好,很简洁。开始时星星都不亮,每个坐标的星星只能是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;
}