Stars
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others)Total Submission(s): 1996 Accepted Submission(s): 848
To make the problem easier,we considerate the sky is a two-dimension plane.Sometimes the star will be bright and sometimes the star will be dim.At first,there is no bright star in the sky,then some information will be given as "B x y" where 'B' represent bright and x represent the X coordinate and y represent the Y coordinate means the star at (x,y) is bright,And the 'D' in "D x y" mean the star at(x,y) is dim.When get a query as "Q X1 X2 Y1 Y2",you should tell Yifenfei how many bright stars there are in the region correspond X1,X2,Y1,Y2.
There is only one case.
each line start with a operational character.
if the character is B or D,then two integer X,Y (0 <=X,Y<= 1000)followed.
if the character is Q then four integer X1,X2,Y1,Y2(0 <=X1,X2,Y1,Y2<= 1000) followed.
5 B 581 145 B 581 145 Q 0 600 0 200 D 581 145 Q 0 600 0 200
1 0
思路:用二维树状数组来做,更新单点的时候,要有一个数组记录这个单点是否为亮的。当该点已经亮着则只能进行熄灭的操作,反之只能进行点亮的操作。
最后查询的时候注意这是个二维的,query(x+1,y+1)是算(1,1)到(x+1,y+1)所有亮点的个数。所以要减去两个矩形加上一个矩形的面积才是最后的答案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX_N 1100
using namespace std;
int tr[MAX_N][MAX_N];
int stars[MAX_N][MAX_N];//存星星的状态
int lowbit(int i)
{
return i&(-i);
}
void update(int x,int y,int c)
{
for(int i=x;i<=MAX_N;i+=lowbit(i))
for(int j=y;j<=MAX_N;j+=lowbit(j))
tr[i][j]+=c;
}
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+=tr[i][j];
return sum;
}
int main()
{
int n,x,y;
scanf("%d",&n);
while(n--)
{
char c[5];
scanf("%s",c);
if(c[0]=='B')
{
scanf("%d%d",&x,&y);
if(!stars[x+1][y+1])
{
stars[x+1][y+1]=1;
update(x+1,y+1,1);
}
}
else if(c[0]=='D')
{
scanf("%d%d",&x,&y);
if(stars[x+1][y+1])
{
stars[x+1][y+1]=0;
update(x+1,y+1,-1);
}
}
else
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
if(x1>x2) swap(x1,x2);//注意题目的输入
if(y1>y2) swap(y1,y2);
printf("%d\n",query(x2+1,y2+1)-query(x2+1,y1)-query(x1,y2+1)+query(x1,y1));
}
}
}
947



被折叠的 条评论
为什么被折叠?



