B. Dima and a Bad XOR(异或+思维)
Posted letlifestop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B. Dima and a Bad XOR(异或+思维)相关的知识,希望对你有一定的参考价值。
题目链接:
https://codeforces.com/problemset/problem/1151/B
题目大意:
给你一个n*m的矩阵,每一行你可以选一个数,在每一行都选数的前提下,问你能不能能使每一行选的这些数的异或值不是0,如果存在的话,输出这些下标。
具体思路:
首先我们把第一列异或起来,判断这一列的异或起来的值是不是0,如果不是0的话,直接输出;否则对于每一行,找到一个不和这一行第一个不相等的数,找到就立即停。如果找不到就是凑不出来。
具体证明:
如果每一行找不到的话,就说明每一行的数是相同的,也就是无论你怎么选,结果都是相同的。得证
这题思路属实nb
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 const int maxn = 550; 5 const ll mod = 1e9+7; 6 int a[maxn][maxn]; 7 int main() 8 9 int n,m; 10 scanf("%d %d",&n,&m); 11 for(int i=1; i<=n; i++) 12 13 for(int j=1; j<=m; j++) 14 15 scanf("%d",&a[i][j]); 16 17 18 int flag=1; 19 int ans=0; 20 for(int i=1; i<=n; i++) 21 22 ans^=a[i][1]; 23 24 if(ans) 25 26 printf("TAK\n"); 27 for(int i=1; i<=n; i++) 28 29 printf("1 "); 30 31 printf("\n"); 32 33 else 34 35 int pos=-1; 36 int tmp=0; 37 for(int i=1; i<=n; i++) 38 39 int k=0; 40 for(int j=2; j<=m; j++) 41 42 if(a[i][j]!=a[i][1]) 43 44 pos=i; 45 tmp=j; 46 k=1; 47 break; 48 49 50 if(k) 51 break; 52 53 if(pos==-1) 54 55 printf("NIE\n"); 56 57 else 58 59 printf("TAK\n"); 60 for(int i=1; i<=n; i++) 61 62 if(i==pos) 63 printf("%d ",tmp); 64 else 65 printf("1 "); 66 67 printf("\n"); 68 69 70 71 return 0; 72
以上是关于B. Dima and a Bad XOR(异或+思维)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 366C Dima and Salad:背包dp
Codeforces 358D. Dima and Hares (dp)