poj 2155 Matrix
这个题可以用二位数状数组也可以用二维线段树做:
法一:
View Code
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using namespace std; class Node { public: int r,l,val; }n[3024][3024]; class Tree { public: int l,r; }t[3024]; int ans = 0; void build_tree( Node *p , int l , int r , int cnt ) { p[cnt].l = l ; p[cnt].r = r ; p[cnt].val = 0; if( l == r ) return ; int mid = ( l + r )>>1; build_tree( p, l , mid , cnt*2 ); build_tree( p, mid + 1 , r , cnt*2+1 ); } void build( int l , int r , int cnt ,int N ) { t[cnt].l = l ; t[cnt].r = r; build_tree( n[cnt] ,1 , N , 1 ); if( l == r ) return; int mid = ( l + r )>>1; build( l , mid , cnt*2 , N ); build( mid + 1, r , cnt*2+1 , N ); } void modify_tree( Node *p , int l , int r , int cnt ) { if( l <= p[cnt].l && p[cnt].r<=r ) { p[cnt].val ^= 1; return; } int mid = ( p[cnt].l + p[cnt].r )>>1; if( mid >= r ) modify_tree( p , l , r , cnt*2 ); else if( mid < l ) modify_tree( p , l , r , cnt*2 + 1 ); else { modify_tree( p , l , mid , cnt*2 ); modify_tree( p , mid + 1, r , cnt*2 + 1 ); } } void modify( int l , int r ,int y1 , int y2, int cnt ) { if( l <= t[cnt].l&&t[cnt].r<=r ) { modify_tree( n[cnt],y1,y2 , 1 ); return ; } int mid = ( t[cnt]. l + t[cnt].r )>>1; if( mid >= r ) modify( l , r , y1 , y2 , cnt*2 ); else if( mid < l ) modify( l , r , y1 , y2 , cnt*2 + 1 ); else { modify( l , mid , y1 , y2 ,cnt*2 ); modify( mid + 1, r , y1 , y2 ,cnt*2 + 1 ); } } void Cal_y( Node *p ,int l , int r , int cnt ) { if( l>=p[cnt].l && r<= p[cnt].r ) ans ^=p[cnt].val; if( p[cnt].l == p[cnt].r ) return; int mid = ( p[cnt].l + p[cnt].r )>>1; if( mid >= r ) Cal_y( p , l , r , cnt*2 ); else Cal_y( p , l , r , cnt*2 +1 ); } void Cal( int l , int r , int y1 , int y2 , int cnt ) { if( l >= t[cnt].l && r<= t[cnt].r ) Cal_y( n[cnt] ,y1 , y2 , 1 ); if( t[cnt].l == t[cnt].r ) return; int mid = ( t[cnt].l + t[cnt].r )>>1; if( mid >= r ) Cal( l , r , y1 ,y2 , cnt*2 ); else Cal( l , r , y1 , y2 ,cnt*2 + 1 ); } int main( ) { int T,N,M,x1,y1,x2,y2; char str[3]; while( scanf( "%d",&T )==1 ) { while( T -- ) { scanf( "%d %d",&N,&M ); build( 1 , N , 1 ,N ); for( int i = 0 ; i < M ; i ++ ){ scanf( "%s",str ); if( str[0] == 'C' ){ scanf( "%d %d %d %d",&x1, &y1,&x2 ,&y2 ); modify( x1 , x2 , y1 , y2 ,1 ); } else { ans = 0; scanf( "%d %d",&x1,&y1 ); Cal( x1 ,x1 ,y1,y1,1 ); printf( "%d\n",ans); } } puts( "" ); } } //system( "pause" ); return 0; }
法二:
View Code
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using namespace std; int c[1024][1024]; int lowbit( int x ) { return x&(-x); } void Updata( int x , int y , int n ) { for( int i = x ; i <= n ; i += lowbit( i ) ) for( int j = y ; j <= n ; j += lowbit( j ) ) c[i][j] ++; } int Sum( int x , int y , int n ) { int sum = 0; for( int i = x ; i > 0 ; i -= lowbit( i ) ) for( int j = y ; j > 0 ; j -= lowbit( j ) ) sum += c[i][j]; return sum; } int main( ) { int T,N,M,x1,y1,x2,y2; char str[3]; while( scanf( "%d",&T )==1 ) { while( T -- ) { scanf( "%d %d",&N,&M ); memset( c , 0 , sizeof( c ) ); for( int i = 0 ; i < M ; i ++ ){ scanf( "%s",str ); if( str[0] == 'C' ){ scanf( "%d %d %d %d",&x1, &y1,&x2 ,&y2 ); Updata( x1 , y1 , N ); Updata( x1 , y2 + 1 , N ); Updata( x2 + 1 , y1 , N ); Updata( x2 + 1, y2 + 1 , N ); } else { scanf( "%d %d",&x1,&y1 ); printf( "%d\n",Sum( x1 , y1 ,N )%2); } } puts( "" ); } } //system( "pause" ); return 0; }