/**
* hdu2642
* 二维树状数组
*
* 因为从0开始,所以要加一
*
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mmax = 1002;
const int LEN = 1000;
int tr[mmax][mmax];
bool visit[mmax][mmax];
int lowbit(int k)
{
return k & (-k);
}
void update(int x, int y, int p)
{
for(int i = x; i <= LEN; i += lowbit(i))
{
for(int j = y; j <= LEN; j += lowbit(j))
{
tr[i][j]+=p;
}
}
}
int sum(int x, int y)
{
int s = 0;
for(int i = x; i > 0; i -= lowbit(i))
{
for(int j = y; j > 0; j -= lowbit(j))
{
s += tr[i][j];
}
}
return s;
}
int main()
{
int m;
scanf("%d", &m);
memset(tr, 0, sizeof(tr));
memset(visit, 0, sizeof(visit));
while(m--)
{
getchar();
char order;
scanf("%c", &order);
if(order == 'B')
{
int x, y;
scanf("%d%d", &x, &y);
x++,y++;
if(visit[x][y])
continue;
update(x, y, 1);
visit[x][y] = true;
}
else if(order == 'D')
{
int x, y;
scanf("%d%d", &x, &y);
x++,y++;
if(!visit[x][y])
continue;
update(x, y, -1);
visit[x][y] = false;
}
else
{
int x1, x2, y1, y2;
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
x1++,y1++;
x2++,y2++;
if(x1 > x2)
{
int temp = x1;
x1 = x2;
x2 = temp;
}
if(y1 > y2)
{
int temp = y1;
y1 = y2;
y2 = temp;
}
int result = sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1);
printf("%d\n", result);
}
}
return 0;
}
HDU2642(容斥定理+二维树状数组)
最新推荐文章于 2018-10-09 13:49:01 发布