地址:
点击打开链接
这个题目就是一个裸的二位树状数组的题目。
但是需要注意两点,第一次TE了,原因是没把0边界考虑进去,第二个是,还需要自己找MAX和min不要想当然。
代码:
#include<iostream> #include<cstdio> #include<string.h> using namespace std ; #define MAX 1005 int sum[MAX][MAX]; int Rem[MAX][MAX]; int lowBit(int a) { return a&(-a); } void update(int x , int y , int d) { for(int i = x ; i < MAX ; i +=lowBit(i)) { for(int j = y ; j <MAX ; j +=lowBit(j)) { sum[i][j]+=d; } } } int getSum(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 +=sum[i][j]; } } return res ; } int main(){ int T ,x,y,xp,yp; string comd ; memset(sum,0,sizeof(sum)); memset(Rem,0,sizeof(Rem)); scanf("%d",&T); while(T--) { cin >>comd; if(comd[0]=='B') { scanf("%d%d",&x,&y); x++; y++; if(Rem[x][y]==1) continue ; else { Rem[x][y]=1; update(x,y,1); } } else if(comd[0]=='D') { scanf("%d%d",&x,&y); x++;y++; if(Rem[x][y]==1) { update(x,y,-1); Rem[x][y]=0 ; } }else if(comd[0]=='Q') { scanf("%d%d%d%d",&x,&xp,&y,&yp); x++;xp++;y++;yp++; int xmax = max(x,xp); int xmin = min(x,xp); int ymax = max(y,yp); int ymin = min(y,yp); int res = 0 ; res = getSum(xmax,ymax)-getSum(xmin-1,ymax)-getSum(xmax,ymin-1)+getSum(xmin-1,ymin-1); cout << res <<endl ; } } }