Clarke and puzzle
Accepts: 129
Submissions: 322
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
克拉克是一名人格分裂患者。某一天,有两个克拉克(aa和bb)在玩一个方格游戏。 这个方格是一个n*mn∗m的矩阵,每个格子里有一个数c_{i, j}c?i,j??。 aa想开挂,想知道如何打败bb。 他们要玩qq次游戏,每一次做一次操作: 1. 取出当中的一个子矩阵(x_1, y_1)-(x_2, y_2)(x?1??,y?1??)−(x?2??,y?2??)玩游戏。两个人轮流行动,每一次只能从这个子矩阵中的一个方格c_{i, j}c?i,j??中减掉一个的数d(1 \le d \le c_{i, j})d(1≤d≤c?i,j??),当一个格子的数为00时则不能减。如果操作完后另一者无法操作,那么胜利。否则失败。现在aa作为先手,想知道是否存在一种方案使得自己胜利。 2. 将c_{i, j}c?i,j??的数改成bb
输入描述
第一行一个整数T(1 \le T \le 5)T(1≤T≤5),表示数据的组数。 每组数据第一行为三个整数n, m, q(1 \le n, m \le 500, 1 \le q \le 2*10^5)n,m,q(1≤n,m≤500,1≤q≤2∗10?5??)。 接下来是一个nn行mm列的矩阵,其中第ii行第jj列的数为c_{i, j}(0 \le c_{i, j} \le 10^9)c?i,j??(0≤c?i,j??≤10?9??)。 接下来时qq行,第一个数为optopt。当opt=1opt=1时,后面接着四个整数,依次表示x_1, y_1, x_2, y_2(1 \le x_1 \le x_2 \le n, 1 \le y_1 \le y_2 \le m)x?1??,y?1??,x?2??,y?2??(1≤x?1??≤x?2??≤n,1≤y?1??≤y?2??≤m),表示一个询问;当opt=2opt=2时,后面接着三个整数x, y, z(1 \le x \le n, 1 \le y \le m, 0 \le z \le 10^9)x,y,z(1≤x≤n,1≤y≤m,0≤z≤10?9??),表示将c_{x, y}c?x,y??更改为zz。
输出描述
对于每组数据,每个询问输出aa是否能胜利,如果能,输出YesYes,否则输出NoNo。
输入样例
1 1 2 3 1 2 1 1 1 1 2 2 1 2 1 1 1 1 1 2
输出样例
Yes No
Hint
第一个询问:一开始aa可以在(1, 2)(1,2)的格子上减掉11,则接下来无论bb怎么选,都还剩一个11,所以aa胜利。 第二个询问:无论aa怎么选,都还剩下一个11,所以bb胜利。 比赛的时候没过.还以为是树状数组写残了.但实际上是有自己不知道的东西.这种博弈叫 nim游戏所以这是一个二维的nim游戏.nim游戏的性质是xor 和为0必败,否则必胜.xor和也有前缀和性质,所以可以用树状数组维护.
1 /************************************************************************* 2 > File Name: code/bc/#56/r1003.cpp 3 > Author: 111qqz 4 > Email: [email protected] 5 > Created Time: 2015年09月22日 星期二 11时10分06秒 6 ************************************************************************/ 7 8 #include<iostream> 9 #include<iomanip> 10 #include<cstdio> 11 #include<algorithm> 12 #include<cmath> 13 #include<cstring> 14 #include<string> 15 #include<map> 16 #include<set> 17 #include<queue> 18 #include<vector> 19 #include<stack> 20 #include<cctype> 21 #define y1 hust111qqz 22 #define yn hez111qqz 23 #define j1 cute111qqz 24 #define ms(a,x) memset(a,x,sizeof(a)) 25 #define lr dying111qqz 26 using namespace std; 27 #define For(i, n) for (int i=0;i<int(n);++i) 28 typedef long long LL; 29 typedef double DB; 30 const int inf = 0x3f3f3f3f; 31 const int N=5E2+5; 32 int c[N][N]; 33 int a[N][N]; 34 int n,m,q; 35 int lowbit ( int x) 36 { 37 return x&(-x); 38 } 39 void update (int x,int y,int delta) 40 { 41 for ( int i = x ; i <= n ; i = i + lowbit(i)) 42 { 43 for ( int j = y ; j <= m ; j = j + lowbit(j)) 44 { 45 c[i][j]^=delta; 46 } 47 } 48 } 49 50 int sum( int x,int y) 51 { 52 int res = 0; 53 for ( int i = x; i >= 1 ; i = i - lowbit(i)) 54 { 55 for ( int j = y ; j >= 1 ; j = j - lowbit(j)) 56 { 57 res ^= c[i][j]; 58 } 59 } 60 return res; 61 } 62 int main() 63 { 64 #ifndef ONLINE_JUDGE 65 freopen("in.txt","r",stdin); 66 #endif 67 68 int T; 69 scanf("%d",&T); 70 while (T--) 71 { 72 ms(c,0); 73 74 scanf("%d %d %d",&n,&m,&q); 75 for ( int i = 1 ; i <= n ; i++) 76 { 77 for ( int j = 1 ; j <= m ; j++) 78 { 79 scanf("%d",&a[i][j]); 80 update (i,j,a[i][j]); 81 } 82 } 83 84 for (int i = 0 ; i < q ; i++) 85 { 86 int opt; 87 scanf("%d",&opt); 88 if (opt==1) 89 { 90 int x1,x2,y1,y2; 91 scanf("%d %d %d %d",&x1,&y1,&x2,&y2); 92 int tmp = sum(x2,y2)^sum(x2,y1-1)^sum(x1-1,y2)^sum(x1-1,y1-1); 93 if (tmp>0) 94 { 95 puts("Yes"); 96 } 97 else 98 { 99 puts("No"); 100 } 101 } 102 else 103 { 104 int x,y,z; 105 scanf("%d %d %d",&x,&y,&z); 106 update (x,y,a[x][y]); //清零 107 a[x][y] = z; 108 update (x,y,a[x][y]); 109 } 110 } 111 } 112 113 114 #ifndef ONLINE_JUDGE 115 fclose(stdin); 116 #endif 117 return 0; 118 }
时间: 2024-11-12 06:18:03