bestcoder #56 div 2 C Clarke and puzzle (nim游戏 树状数组)
比赛的时候没过.还以为是树状数组写残了. 但实际上是有自己不知道的东西. 这种博弈叫 nim游戏 所以这是一个二维的nim游戏. **nim游戏的性质是xor 和为0必败,否则必胜. xor和也有前缀和性质,所以可以用树状数组维护.
1/*************************************************************************
2 > File Name: code/bc/#56/r1003.cpp
3 > Author: 111qqz
4 > Email: rkz2013@126.com
5 > Created Time: 2015年09月22日 星期二 11时10分06秒
6 ************************************************************************/
7#include<iostream>
8#include<iomanip>
9#include<cstdio>
10#include<algorithm>
11#include<cmath>
12#include<cstring>
13#include<string>
14#include<map>
15#include<set>
16#include<queue>
17#include<vector>
18#include<stack>
19#include<cctype>
20#define y1 hust111qqz
21#define yn hez111qqz
22#define j1 cute111qqz
23#define ms(a,x) memset(a,x,sizeof(a))
24#define lr dying111qqz
25using namespace std;
26#define For(i, n) for (int i=0;i<int(n);++i)
27typedef long long LL;
28typedef double DB;
29const int inf = 0x3f3f3f3f;
30const int N=5E2+5;
31int c[N][N];
32int a[N][N];
33int n,m,q;
34int lowbit ( int x)
35{
36 return x&(-x);
37}
38void update (int x,int y,int delta)
39{
40 for ( int i = x ; i <= n ; i = i + lowbit(i))
41 {
42 for ( int j = y ; j <= m ; j = j + lowbit(j))
43 {
44 c[i][j]^=delta;
45 }
46 }
47}
48int sum( int x,int y)
49{
50 int res = 0;
51 for ( int i = x; i >= 1 ; i = i - lowbit(i))
52 {
53 for ( int j = y ; j >= 1 ; j = j - lowbit(j))
54 {
55 res ^= c[i][j];
56 }
57 }
58 return res;
59}
60int main()
61{
62 #ifndef ONLINE_JUDGE
63 freopen("in.txt","r",stdin);
64 #endif
65 int T;
66 scanf("%d",&T);
67 while (T--)
68 {
69 scanf("%d %d %d",&n,&m,&q);
70 for ( int i = 1 ; i <= n ; i++)
71 {
72 for ( int j = 1 ; j <= m ; j++)
73 {
74 scanf("%d",&a[i][j]);
75 update (i,j,a[i][j]);
76 }
77 }
78 for (int i = 0 ; i < q ; i++)
79 {
80 int opt;
81 scanf("%d",&opt);
82 if (opt==1)
83 {
84 int x1,x2,y1,y2;
85 scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
86 int tmp = sum(x2,y2)^sum(x2,y1-1)^sum(x1-1,y2)^sum(x1-1,y1-1);
87 if (tmp>0)
88 {
89 puts("Yes");
90 }
91 else
92 {
93 puts("No");
94 }
95 }
96 else
97 {
98 int x,y,z;
99 scanf("%d %d %d",&x,&y,&z);
100 update (x,y,a[x][y]); //清零
101 a[x][y] = z;
102 update (x,y,a[x][y]);
103 }
104 }
105 }
106 #ifndef ONLINE_JUDGE
107 fclose(stdin);
108 #endif
109 return 0;
110}