您的位置:首页 > 其它

hdu 2642 Stars(二维树状数组)

2013-11-14 11:06 274 查看

Stars

Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others)

Total Submission(s): 886 Accepted Submission(s): 382



[align=left]Problem Description[/align]
Yifenfei is a romantic guy and he likes to count the stars in the sky.

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.

[align=left]Input[/align]
The first line contain a M(M <= 100000), then M line followed.

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.

[align=left]Output[/align]
For each query,output the number of bright stars in one line.

[align=left]Sample Input[/align]

5
B 581 145
B 581 145
Q 0 600 0 200
D 581 145
Q 0 600 0 200


[align=left]Sample Output[/align]

1
0
题意:有许多星星分布在坐标系中,一开始所有星星都是暗的,然后有m个操作:B:x,y   使位于坐标(x,y)的星星发光。D:x,y   使位于坐标(x,y)的星星变暗。Q:x1,x2,y1,y2  计算位于(x1,y1)和(x2,y2)围成的区域内发光的星星的数目
思路:简单二维数组应用。二维数组详解:http://www.java3z.com/cwbwebhome/article/article1/1369.html?id=4804
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <cmath>
#include <cstdlib>
#define L(rt) (rt<<1)
#define R(rt) (rt<<1|1)
#define ll __int64
#define eps 1e-6

using namespace std;
const int INF = 1000000000;
const int maxn = 1005;
int c[maxn][maxn];
bool a[maxn][maxn];
int m;
int lowbit(int x)
{
return x & (- x);
}

void add(int x, int y, int d)
{
for(int i = x; i < maxn; i += lowbit(i))
for(int j = y; j < maxn; j += lowbit(j))
c[i][j] += d;
}
int sum(int x, int y)      //求前i行前j列的元素总和
{
int ret = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
ret += c[i][j];
return ret;
}
int main()
{
int x1, y1, x2, y2;
char op[3];
while(~scanf("%d", &m))
{
memset(a, false, sizeof(a));
memset(c, 0, sizeof(c));
while(m--)
{
scanf("%s", op);
if(op[0] == 'B')
{
scanf("%d%d", &x1, &y1);
x1++; y1++;
if(!a[x1][y1])
{
add(x1, y1, 1);
a[x1][y1] = true;
}
}
else if(op[0] == 'D')
{
scanf("%d%d", &x1, &y1);
x1++; y1++;
if(a[x1][y1])
{
add(x1, y1, -1);
a[x1][y1] = false;
}
}
else
{
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
x1++; x2++; y1++; y2++;
if(x1 > x2) swap(x1, x2);
if(y1 > y2) swap(y1, y2);
printf("%d\n", sum(x2, y2) - sum(x2, y1 - 1) - sum(x1 - 1, y2) + sum(x1 - 1, y1 -1));
}
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: