Problem - 1151B - Codeforces
来自Kremland的学生Dima有一个大小为n×m的非负整数矩阵a。
他希望从矩阵的每一行中选择一个整数,以便所选整数的按位互斥或严格大于0。帮助他!
形式上,他想选择一个整数序列c1,c2,…,cn(1≤cj≤m),使不等式a1,c1⊕a2,c2⊕…⊕an,cn>0成立,其中ai,j是来自第i行和第j列的矩阵元素。
这里x⊕y表示整数x和y的按位异或运算。
输入
第一行包含两个整数n和m(1≤n,m≤500)——矩阵a的行数和列数。
接下来的n行包含m个整数:第i行第j个整数是矩阵a第i行第j个元素,即ai,j(0≤ai,j≤1023)。
输出
如果无法从每行中选择一个整数使其按位不相等或严格大于零,则打印"NIE"。
否则在第一行打印"TAK",在下一行打印n个整数c1,c2,…cn(1≤cj≤m),使不等式a1,c1⊕a2,c2⊕…⊕an,cn>0成立。
如果有多个可能的答案,则可以输出任何一个。
例子
inputCopy
3 - 2
0 0
0 0
0 0
outputCopy
聂
inputCopy
2 3
7 7 7
7 7 10
outputCopy
达克
1 3
请注意
在第一个例子中,矩阵中的所有数字都是0,因此不可能在表的每行中选择一个数字,使它们按位不相等或严格大于0。
在第二个示例中,选择的数字是7(第一行中的第一个数字)和10(第二行中的第三个数字),7⊕10=13,13大于0,因此可以找到答案。
题解:
我们可以都先取每行第一个构造一个答案
如果答案符合输出即可,
如果答案不符合
根据异或的性质我们遍历每一行,每一列,如果有每行元素有与第一个不同的直接输出即可
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
#include<stack>
#include<set>
using namespace std;
#define int long long
typedef pair<int,int> PII;
int mp[505][505];
int cnt[100];
vector<PII> v[100],l[101];
void solve()
{
int n,m;
cin >> n >> m;
int ans = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin >> mp[i][j];
}
ans ^= mp[i][1];
}
if(ans)
{
cout <<"TAK\n";
for(int i = 1;i <= n;i++)
{
cout <<1<<" ";
}
return ;
}
for(int i = 1;i <= n;i++)
{
for(int j =2 ;j <= m;j++)
{
if(mp[i][j] != mp[i][1])
{
cout <<"TAK\n";
for(int k = 1;k <= n;k++)
{
if(k != i)
{
cout << 1<<" ";
}
else
{
cout << j <<" ";
}
}
return ;
}
}
}
cout <<"NIE";
}
//0 1 1 1
//1 0 1 0
signed main(){
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
int t = 1;
// cin >> t;
while(t--)
{
solve();
}
}
//3 3 2 2 1 0
//1 2 1 1 1 0