刷题 位运算 与&和或|
2023.12.2 cf 1903B
对位运算实在不太熟练()
本题思路
这道题我们不能确定a的准确值,但是可以通过Mij来算出尽可能大的ai
例如:(注意主对角线全为0)
a1=M12&M13&M14......
a2=M21&M23&M24......
再将所有的a代回原式,满足条件就ok,不满足那就不行(连尽可能大的a都不满足了其他的更不可能)
一开始将a都初始化成(1<<30)-1
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int N=1005;
int m[N][N],a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
a[i]=(1<<30)-1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>m[i][j];
if(i!=j)
{
a[i]&=m[i][j];
a[j]&=m[i][j];
}
}
}
bool ok=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&(a[i]|a[j])!=m[i][j])ok=0;//或(|)的优先级比!=要低,注意加括号
}
}
if(ok)
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
cout<<endl;
}
else cout<<"NO"<<endl;
}
return 0;
}

浙公网安备 33010602011771号