• hdu 5465 Clarke and puzzle(前缀和,异或,nim博弈)


    Problem Description
    Clarke is a patient with multiple personality disorder. One day, Clarke split into two personality a and b, they are playing a game. 
    There is a n∗m matrix, each grid of this matrix has a number ci,j. 
    a wants to beat b every time, so a ask you for a help. 
    There are q operations, each of them is belonging to one of the following two types: 
    1. They play the game on a (x1,y1)−(x2,y2) sub matrix. They take turns operating. On any turn, the player can choose a grid which has a positive integer from the sub matrix and decrease it by a positive integer which less than or equal this grid's number. The player who can't operate is loser. a always operate first, he wants to know if he can win this game. 
    2. Change ci,j to b. 

    Input
    The first line contains a integer T(1≤T≤5), the number of test cases. 
    For each test case: 
    The first line contains three integers n,m,q(1≤n,m≤500,1≤q≤2105) 
    Then n∗m matrix follow, the i row j column is a integer ci,j(0≤ci,j≤109) 
    Then q lines follow, the first number is opt. 
    if opt=1, then 4 integers x1,y1,x1,y2(1≤x1≤x2≤n,1≤y1≤y2≤m) follow, represent operation 1. 
    if opt=2, then 3 integers i,j,b follow, represent operation 2.
     
    Output
    For each testcase, for each operation 1, print Yes if a can win this game, otherwise print No.
    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
     

     题目要求二维的nim游戏,考虑到nim的结论是xor和为0则必败、否则必胜,那么我们只需要维护子矩阵的xor和。由于xor有前缀和性质,所以我们可以用一个二维bit来维护(1, 1)-(a, b)的矩阵的xor和,然后由sum(x2,y2) xor sum(x2,y1−1) xor sum(x1−1,y2) xor sum(x1−1,y1−1)sum(x2, y2) xor sum(x2, y1-1) xor sum(x1-1, y2) xor sum(x1-1, y1-1)sum(x2,y2) xor sum(x2,y11) xor sum(x11,y2) xor sum(x11,y11)来得到答案即可。单点修改在bit上是很容易的。

     1 #pragma comment(linker, "/STACK:1024000000,1024000000")
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<math.h>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<set>
    10 #include<bitset>
    11 #include<map>
    12 #include<vector>
    13 #include<stdlib.h>
    14 #include <stack>
    15 using namespace std;
    16 int dirx[]={0,0,-1,1};
    17 int diry[]={-1,1,0,0};
    18 #define PI acos(-1.0)
    19 #define max(a,b) (a) > (b) ? (a) : (b)  
    20 #define min(a,b) (a) < (b) ? (a) : (b)
    21 #define ll long long
    22 #define eps 1e-10
    23 #define MOD 1000000007
    24 #define N 506
    25 #define inf 1e12
    26 int n,m,q;
    27 int mp[N][N];
    28 int a[N][N];
    29 int main()
    30 {
    31     int t;
    32     scanf("%d",&t);
    33     while(t--){
    34         scanf("%d%d%d",&n,&m,&q);
    35         for(int i=1;i<=n;i++){
    36             for(int j=1;j<=m;j++){
    37                 scanf("%d",&mp[i][j]);
    38                 a[i][j]=a[i][j-1]^mp[i][j];
    39             }
    40         }
    41         for(int i=0;i<q;i++){
    42             int opt;
    43             scanf("%d",&opt);
    44             int x,y,z;
    45             if(opt==2){
    46                 scanf("%d%d%d",&x,&y,&z);
    47                 mp[x][y]=z;
    48                 for(int j=y;j<=m;j++){
    49                     a[x][j]=a[x][j-1]^mp[x][j];
    50                 }
    51             }
    52             else{
    53                 int ans=0;
    54                 int x1,y1,x2,y2;
    55                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    56                 for(int j=x1;j<=x2;j++){
    57                     ans=ans^(a[j][y2]^a[j][y1-1]);
    58                 }
    59                 if(ans==0){
    60                     printf("No
    ");
    61                 }
    62                 else{
    63                     printf("Yes
    ");
    64                 }
    65             }
    66         }
    67     }
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    Dapper的常用操作
    git下载慢的解决方案
    笔记
    第06组 Beta冲刺(3/5)
    第06组 Beta冲刺(2/5)
    第06组 Beta冲刺(1/5)
    第06组 Alpha事后诸葛亮
    第06组 Alpha冲刺(6/6)
    第06组 Alpha冲刺(5/6)
    第06组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4830186.html
Copyright © 2020-2023  润新知