B. 与矩阵
https://acm.ecnu.edu.cn/contest/255/problem/B/
单点时限: 1.0 sec
内存限制: 512 MB
前有牛顿瘟疫“家里蹲”发明微积分。
现有 Cuber QQ 新冠肺炎“家里蹲”发明与矩阵。
与矩阵是一个
n
×
n
n×n
n×n 的矩阵。规定矩阵中的第
i
i
i 行第
j
j
j 列记为
(
i
,
j
)
(i,j)
(i,j) 。
生成一个与矩阵的方式是,先生成一个长度为
n
n
n 的数列
a
1
,
a
2
,
…
,
a
n
−
1
,
a
n
a_1,a_2,…,a_{n−1},a_n
a1,a2,…,an−1,an ,而矩阵中 KaTeX parse error: Expected 'EOF', got '&' at position 10: (i,j)=a_i&̲a_j 。
其中 KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲ 是指按位与运算,其计算方式是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为 1 时,结果位才为 1 。
Cuber QQ 发现,同一个与矩阵可能对应着一些不同的数列,不过 Cuber QQ 现在只想知道字典序最小的数列是什么样的。
对于两个数列
a
1
,
a
2
,
…
,
a
n
−
1
,
a
n
a_1,a_2,…,a_{n−1},a_n
a1,a2,…,an−1,an 和
b
1
,
b
2
,
…
,
b
n
−
1
,
b
n
b_1,b_2,…,b_{n−1},b_n
b1,b2,…,bn−1,bn ,如果存在一个整数
k
(
1
≤
k
≤
n
)
k (1≤k≤n)
k(1≤k≤n) 满足
a
k
+
1
<
b
k
+
1
a_{k+1}<b_{k+1}
ak+1<bk+1 且
a
1
=
b
1
,
a
2
=
b
2
,
…
,
a
k
=
b
k
a_1=b_1,a_2=b_2,…,a_k=b_k
a1=b1,a2=b2,…,ak=bk ,我们就认为数列
a
1
,
a
2
,
…
,
a
n
−
1
,
a
n
a_1,a_2,…,a_{n−1},a_n
a1,a2,…,an−1,an 的字典序要小于数列
b
1
,
b
2
,
…
,
b
n
−
1
,
b
n
b_1,b_2,…,b_{n−1},b_n
b1,b2,…,bn−1,bn 。
当然,Cuber QQ 不会这么容易让你得到答案,他会把矩阵所有的
(
i
,
i
)
(
1
≤
i
≤
n
)
(i,i) (1≤i≤n)
(i,i)(1≤i≤n) 的位置全部隐藏,只显示为 0 。
输入格式
第一行输入一个整数
n
(
1
≤
n
≤
1000
)
n (1≤n≤1000)
n(1≤n≤1000) ,表示矩阵的大小。
接下来的
n
n
n 行,每行
n
n
n 个用空格隔开的整数
a
i
,
1
,
a
i
,
2
,
…
,
a
i
,
n
(
0
≤
a
i
,
j
≤
1
0
7
)
a_{i,1},a_{i,2},…,a_{i,n} (0≤a_{i,j}≤10^7)
ai,1,ai,2,…,ai,n(0≤ai,j≤107) ,表示与矩阵。
输入保证至少存在一个可能的解。
输出格式
输出包含一行
n
n
n 个用空格隔开的数,表示字典序最小的数列。
样例
input
3
0 0 1
0 0 2
1 2 0
output
1 2 3
提示
样例中给出的数列为 1,2,3 。
题解:
肯定要按位考虑。对于一个位置
(
i
,
j
)
(i,j)
(i,j) 考虑二进制下的其中一位,如果它所在的行和列中的数在这一位上出现了 1 ,那么必然这个数这一位上一定是 1 。
题目要求字典序最小的,那么我们必然会把所有可以为 0 的位置全部设为 0 ,也就是它所在的行和列中的数在这一位上没有出现了 1 。
很容易证明,这样的到的一定是最小的。
我:怎么说呢……神奇!!!😲
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1005][1005];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
for (int i = 1; i <= n; i++)
{
int ans = 0;
for (int j = 1; j <= n; j++)
ans |= a[i][j];
printf("%d%c", ans, i != n ? ' ' : '\n');
}
return 0;
}