5 B 581 145 B 581 145 Q 0 600 0 200 D 581 145 Q 0 600 0 200
1 0
话说,这是最最裸的二维树状数组,只要掌握了基本的树状数组,在二维的数组里每次更新或是查询的时候多一步操作的可以了~
#include <cstdio> #include <iostream> #include <string.h> #include <vector> #include <stdlib.h> #include <algorithm> using namespace std; int map[1005][1005]; int visit[1005][1005]; int lowbit( int t ) { return t&(-t) ; } int query( int x , int y ) { int sum = 0; int ry ; while( x > 0 ){ ry = y; while( ry > 0 ) { sum += map[x][ry]; ry -= lowbit( ry ); } x -= lowbit( x ); } return sum; } void update( int x , int y , int val ) { int ry; while( x < 1005 ) { ry = y; while( ry < 1005 ){ map[x][ry] += val; ry += lowbit( ry ); } x += lowbit( x ); } } int main( ) { int n; while( scanf("%d",&n) != EOF ) { getchar(); memset( map , 0 , sizeof(map) ); memset( visit , 0 , sizeof(visit) ); char s[10]; int x1,x2,y1,y2; int maxx , maxy , minx, miny; while( n-- ){ scanf("%s",s); if( s[0] == 'B' ){ scanf("%d%d",&x1,&y1); if( visit[x1+1][y1+1] == 0 ){ visit[x1+1][y1+1] = 1; update( x1+1 , y1+1 , 1 ); } } else if( s[0] == 'D' ){ scanf("%d%d",&x1,&y1); if( visit[x1+1][y1+1] == 1 ){ update( x1+1 , y1+1 , -1 ); visit[x1+1][y1+1] = 0; } } else if( s[0] == 'Q' ){ scanf("%d%d%d%d",&x1,&x2,&y1,&y2); maxx = max( x1 , x2 ); maxy = max( y1 , y2 ); minx = min( x1 , x2 ); miny = min( y1 , y2 ); int ret1 , ret2 , ret3 , ret4; ret1 = query(maxx+1 , maxy+1); ret2 = query( maxx+1 , miny ); ret3 = query( minx , maxy+1 ); ret4 = query( minx , miny ); printf("%d\n", ret1 + ret4 - ret3 - ret2 ); } } } return 0; }