题意:就是求每个矩形内的亮的星星的个数
思路:二维的树状数组,相当于优化了的矩阵求和的题目
#include <iostream>
#include <cstdio>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int arr[MAXN][MAXN];
int vis[MAXN][MAXN];
int lowbit(int x){
return x & (-x);
}
void update(int i,int j,int d){
int tmpj;
while (i < MAXN){
tmpj = j;
while (tmpj < MAXN){
arr[i][tmpj] += d;
tmpj += lowbit(tmpj);
}
i += lowbit(i);
}
}
int sum(int i,int j){
int tmpj,sum = 0;
while (i > 0){
tmpj = j;
while (tmpj > 0){
sum += arr[i][tmpj];
tmpj -= lowbit(tmpj);
}
i -= lowbit(i);
}
return sum;
}
int main(){
memset(vis,0,sizeof(vis));
memset(arr,0,sizeof(arr));
int t,a,b,c,d;
char op;
scanf("%d",&t);
while (t--){
getchar();
scanf("%c",&op);
if (op == 'B'){
scanf("%d%d",&a,&b);
a++,b++;
if (!vis[a][b]){
vis[a][b] = 1;
update(a,b,1);
}
}
else if (op == 'D'){
scanf("%d%d",&a,&b);
a++,b++;
if (vis[a][b]){
vis[a][b] = 0;
update(a,b,-1);
}
}
else {
scanf("%d%d%d%d",&a, &b, &c, &d);
a++,b++,c++,d++;
if (b > a)
swap(a,b);
if (d > c)
swap(c,d);
int ans = sum(a,c)+sum(b-1,d-1)-sum(a,d-1)-sum(b-1,c);
printf("%d\n",ans);
}
}
return 0;
}