bestcoder #56 div 2 C Clarke and puzzle (nim游戏 树状数组)

Clarke and puzzle

 
 Accepts: 129
 
 Submissions: 322
 Time Limit: 4000/2000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
克拉克是一名人格分裂患者。某一天,有两个克拉克(aa和bb)在玩一个方格游戏。  
这个方格是一个n*mnm的矩阵,每个格子里有一个数c_{i, j}ci,j​​。  
aa想开挂,想知道如何打败bb。  
他们要玩qq次游戏,每一次做一次操作:  
1. 取出当中的一个子矩阵(x_1, y_1)-(x_2, y_2)(x1​​,y1​​)(x2​​,y2​​)玩游戏。两个人轮流行动,每一次只能从这个子矩阵中的一个方格c_{i, j}ci,j​​中减掉一个的数d(1 \le d \le c_{i, j})d(1dci,j​​),当一个格子的数为00时则不能减。如果操作完后另一者无法操作,那么胜利。否则失败。现在aa作为先手,想知道是否存在一种方案使得自己胜利。  
2. 将c_{i, j}ci,j​​的数改成bb  
输入描述
第一行一个整数T(1 \le T \le 5)T(1T5),表示数据的组数。  
每组数据第一行为三个整数n, m, q(1 \le n, m \le 500, 1 \le q \le 2*10^5)n,m,q(1n,m500,1q2105​​)。  
接下来是一个nn行mm列的矩阵,其中第ii行第jj列的数为c_{i, j}(0 \le c_{i, j} \le 10^9)ci,j​​(0ci,j​​109​​)。  
接下来时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)x1​​,y1​​,x2​​,y2​​(1x1​​x2​​n,1y1​​y2​​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(1xn,1ym,0z109​​),表示将c_{x, y}cx,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: rkz2013@126.com 
  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 }
View Code

 




posted @ 2015-09-22 11:32  111qqz  阅读(247)  评论(0编辑  收藏  举报