刷题 位运算 与&和或|
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号
浙公网安备 33010602011771号