Matrix(线段树版)
poj2155:http://poj.org/problem?id=2155
题意;同上一遍随笔。
题解:这里用二维线段树打了一发。第一次学习别人的代码。才学的。这种树套树的程序,确实很费脑子,一不小心就会晕了,而且这次是用省空间的方法写的。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 bool seg[4010][4009]; 7 int n,ans; 8 void updatey(int i,int l,int r,int j,int y1,int y2){ 9 if(l==y1&&r==y2){ 10 seg[i][j]^=1; 11 return; 12 } 13 int mid=(l+r)/2; 14 if(mid>=y2)updatey(i,l,mid,j*2,y1,y2); 15 else if(mid<y1)updatey(i,mid+1,r,j*2+1,y1,y2); 16 else { 17 updatey(i,l,mid,j*2,y1,mid);//注意这里不要写成updatey(i,l,mid,j*2,y1,(y1+y2)/2) 18 updatey(i,mid+1,r,j*2+1,mid+1,y2); 19 } 20 } 21 void updatex(int i,int l,int r,int x1,int x2,int y1,int y2){ 22 if(l==x1&&r==x2){ 23 updatey(i,1,n,1,y1,y2); 24 return; 25 } 26 int mid=(l+r)/2; 27 if(mid>=x2)updatex(i*2,l,mid,x1,x2,y1,y2); 28 else if(mid<x1)updatex(i*2+1,mid+1,r,x1,x2,y1,y2); 29 else { 30 updatex(i*2,l,mid,x1,mid,y1,y2); 31 updatex(i*2+1,mid+1,r,mid+1,x2,y1,y2); 32 } 33 } 34 void queryY(int i,int l,int r,int j,int y ){ 35 ans^=seg[i][j]; 36 if(l==r)return; 37 int mid=(l+r)/2; 38 if(mid>=y)queryY(i,l,mid,j*2,y); 39 else 40 queryY(i,mid+1,r,j*2+1,y); 41 42 } 43 void queryX(int i,int l,int r,int x,int y){ 44 queryY(i,1,n,1,y); 45 if(l==r)return; 46 int mid=(l+r)/2; 47 if(mid>=x)queryX(i*2,l,mid,x,y); 48 else 49 queryX(i*2+1,mid+1,r,x,y); 50 51 } 52 int t,x1,y1,x2,y2,cas; 53 char temp[4]; 54 int main(){ 55 scanf("%d",&cas); 56 int tt=1; 57 while(cas--){ 58 memset(seg,0,sizeof(seg)); 59 scanf("%d%d",&n,&t); 60 if(tt>1)printf("\n"); 61 tt=2; 62 for(int i=1;i<=t;i++){ 63 scanf("%s%d%d",temp,&x1,&y1); 64 if(temp[0]=='C'){ 65 scanf("%d%d",&x2,&y2); 66 updatex(1,1,n,x1,x2,y1,y2); 67 } 68 else{ 69 ans=0; 70 queryX(1,1,n,x1,y1); 71 printf("%d\n",ans); 72 } 73 74 } 75 } 76 }