本文共 1499 字,大约阅读时间需要 4 分钟。
注意树状数组下标
#include#include #include #include using namespace std;bool vis[1005][1005];int map[1005][1005];int lowbit(int x){ return x&(-x);}void add(int x,int y,int num){ for(int i = x;i <=1002;i+=lowbit(i)) for(int j = y;j <= 1002;j+=lowbit(j)) map[i][j] += num;}int get_sum(int x,int y){ int res = 0; for(int i = x;i > 0;i -= lowbit(i)) for(int j = y;j > 0;j -= lowbit(j)) res += map[i][j]; return res;}int main(){ int n,x,y,x1,y1; char c; while(~scanf("%d",&n)) { memset(vis,false,sizeof(vis)); memset(map,0,sizeof(map)); for(int i = 0;i < n;i++) { cin>>c; if(c=='B') { cin>>x>>y; if(!vis[x+1][y+1]) add(x+1,y+1,1); vis[x+1][y+1] = true; } else if(c=='D') { cin>>x>>y; if(vis[x+1][y+1]) { add(x+1,y+1,-1); vis[x+1][y+1] = false; } } else { cin>>x>>x1>>y>>y1; int min1,min2,max1,max2; min1 = min(x+1,x1+1);min2 = min(y+1,y1+1); max1 = max(x+1,x1+1);max2 = max(y+1,y1+1); int k = get_sum(max1,max2) - get_sum(min1-1,max2) - get_sum(max1,min2-1) + get_sum(min1-1,min2-1); printf("%d\n",k); } } }}