刷题 位运算 与&和或|

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;
}
posted @ 2023-12-02 21:18  modemingzi  阅读(16)  评论(0)    收藏  举报