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("
");
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
",ans);
72         }
73 
74       }
75     }
76 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3861293.html