hdu-5465-二维BIT+nim Clarke and puzzle
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 951 Accepted Submission(s): 349
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke split into two personality b.
Input
The first line contains a integer 2.
Output
For each testcase, for each operation o.
Sample Input
1
1 2 3
1 2
1 1 1 1 2
2 1 2 1
1 1 1 1 2
Sample Output
Yes
No
Hint:
The first enquiry: $a$ can decrease grid $(1, 2)$'s number by $1$. No matter what $b$ operate next, there is always one grid with number $1$ remaining . So, $a$ wins.
The second enquiry: No matter what $a$ operate, there is always one grid with number $1$ remaining. So, $b$ wins.
Source
对于操作1而言就是一个裸的nim博弈,答案就是 {c[x1][y1]^......^c[x2][y2]}
操作二就是改变了格子中的一个数。
用二维BIT来维护矩阵内的异或和即可。
(最近总把下标写错,,把x1,y1写成了i,j检查半天, (误
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ULL unsigned long long 4 #define LL long long 5 int c[510][510]; 6 int C[510][510]; 7 int N,M; 8 inline int lowbit(int x){return x&-x;} 9 void change(int x,int y,int d){ 10 for(int i=x;i<=N;i+=lowbit(i)) 11 for(int j=y;j<=M;j+=lowbit(j)) 12 C[i][j]^=d; 13 } 14 int ask(int x,int y){ 15 int r=0; 16 for(int i=x;i;i-=lowbit(i)) 17 for(int j=y;j;j-=lowbit(j)) 18 r^=C[i][j]; 19 return r; 20 } 21 int main(){ 22 int t,n,m,i,q,j,k,x1,x2,y1,y2; 23 scanf("%d",&t); 24 while(t--){ 25 memset(C,0,sizeof(C)); 26 scanf("%d%d%d",&n,&m,&q); 27 N=n,M=m; 28 for(i=1;i<=n;++i){ 29 for(j=1;j<=m;++j){ 30 scanf("%d",&c[i][j]); 31 change(i,j,c[i][j]); 32 } 33 } 34 35 int opt,d; 36 while(q--){ 37 scanf("%d",&opt); 38 if(opt==1){ 39 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 40 int ans=(ask(x2,y2)^ask(x1-1,y1-1)^ask(x1-1,y2)^ask(x2,y1-1)); 41 ans?puts("Yes"):puts("No"); 42 } 43 else{ 44 scanf("%d%d%d",&x1,&y1,&d); 45 change(x1,y1,(d^c[x1][y1])); 46 c[x1][y1]=d; 47 } 48 } 49 } 50 return 0; 51 }