Official
G - N-SAT Editorial
by
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:
