Official

G - N-SAT Editorial by m_99


\(N\) の上限が \(15\) と小さく、全てのパターンが \(2^N \leq 2^{15} = 32768\) 通りしかないため全て調べることが出来ます。

本問のように調べるパターンがそれぞれ \(0,1\) の値を取る場合は \(0\) 以上 \(2^N\) 未満の整数を各パターンと対応させるとbit演算を用いて各処理が出来、楽です(実装例はその方法です。また、bit全探索と調べると資料が出てきます)。あるいは、再帰的に全状態を列挙する方法も有効です。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    
	int N,M;
	cin>>N>>M;
	
	vector<vector<int>> a(M),b(M);
	
	for(int i=0;i<M;i++){
		int k;
		cin>>k;
		a[i].resize(k);
		b[i].resize(k);
		
		for(int j=0;j<k;j++){
			cin>>a[i][j]>>b[i][j];
			a[i][j]--;
		}
	}
	
	for(int i=0;i<(1<<N);i++){
		bool f = true;
		for(int j=0;j<M;j++){
			bool f2 = false;
			for(int k=0;k<a[j].size();k++){
				if(((i>>a[j][k])&1)==b[j][k])f2 = true;
			}
			if(!f2){
				f = false;
			}
		}
		if(f){
			cout<<"Yes"<<endl;
			return 0;
		}
	}
	
	cout<<"No"<<endl;
	
	return 0;
}

posted:
last update: