POJ-2155 Matrix 二维线段树 | 树状数组

  题目链接:http://poj.org/problem?id=2155

  比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2)。

  也可以用树状数组搞,推荐看NOI 2009 武森《浅谈信息学竞赛中的“0”和“1”》。

 1 //STATUS:C++_AC_907MS_16144KB

 2 #include<stdio.h>

 3 #include<stdlib.h>

 4 #include<string.h>

 5 //#include<math.h>

 6 #include<iostream>

 7 #include<string>

 8 #include<algorithm>

 9 #include<vector>

10 #include<queue>

11 #include<stack>

12 using namespace std;

13 #define LL __int64

14 #define pii pair<int,int>

15 #define Max(a,b) ((a)>(b)?(a):(b))

16 #define Min(a,b) ((a)<(b)?(a):(b))

17 #define mem(a,b) memset(a,b,sizeof(a))

18 #define lson l,mid,rt<<1

19 #define rson mid+1,r,rt<<1|1

20 const int N=1010,INF=0x3f3f3f3f,MOD=100000000;

21 const double DNF=100000000000;

22 

23 bool f[N<<2][N<<2];

24 int T,n,m,a,b,x1,y1,x2,y2,ans;

25 

26 void updatey(int l,int r,int rt,int fa)

27 {

28     if(y1<=l && r<=y2){

29         f[fa][rt]^=1;

30  //   printf(" %d %d %d\n",l,r,f[fa][rt]);//

31         return;

32     }

33     int mid=(l+r)>>1;

34     if(y1<=mid)updatey(lson,fa);

35     if(y2>mid)updatey(rson,fa);

36 }

37 

38 void updatex(int l,int r,int rt)

39 {

40     if(x1<=l && r<=x2){

41  //       printf("%d %d %d\n",l,r,f[rt][0]);//

42         updatey(1,n,1,rt);

43         return;

44     }

45     int mid=(l+r)>>1;

46     if(x1<=mid)updatex(lson);

47     if(x2>mid)updatex(rson);

48 }

49 

50 void queryy(int l,int r,int rt,int fa)

51 {

52     ans^=f[fa][rt];

53  //   printf("  %d\n",f[fa][rt]);

54     if(l==r)return;

55     int mid=(l+r)>>1;

56     if(y1<=mid)queryy(lson,fa);

57     else queryy(rson,fa);

58 }

59 

60 void queryx(int l,int r,int rt)

61 {

62     queryy(1,n,1,rt);

63     if(l==r)return;

64     int mid=(l+r)>>1;

65     if(x1<=mid)queryx(lson);

66     else queryx(rson);

67 }

68 

69 int main()

70 {

71  //   freopen("in.txt","r",stdin);

72     char c;

73     scanf("%d",&T);

74     while(T--)

75     {

76         mem(f,0);

77         scanf("%d%d",&n,&m);

78         while(m--){

79             getchar();

80             scanf("%c",&c);

81             if(c=='C'){

82                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

83                 updatex(1,n,1);

84             }

85             else {

86                 scanf("%d%d",&x1,&y1);

87                 ans=0;

88                 queryx(1,n,1);

89                 printf("%d\n",ans);

90             }

91         }

92         putchar('\n');

93     }

94     return 0;

95 }

 

你可能感兴趣的:(Matrix)