This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
const int maxk = 255;
int n,m,k,x[maxk],y[maxk];
bitset<1<<13> f,g;
vector<pair<int,int>> E;
void build(){
for(int S=0;S<(1<<n);S++){
function<void(int,int)> dfs = [&](int i,int T){
if(i==n){
E.push_back({S,T});
return;
}
if(S>>i&1){
dfs(i+1,T);
return;
}
if(i<n-1 && !(S>>(i+1)&1)){
if(!(T>>i&1)) dfs(i+2,T^(1<<i));
if(!(T>>(i+1)&1)) dfs(i+2,T^(1<<(i+1)));
}
if(i && !(T>>i&1) && !(T>>(i-1)&1)) dfs(i+1,T^(3<<(i-1)));
if(i<n-1 && !(T>>i&1) && !(T>>(i+1)&1)) dfs(i+1,T^(3<<i));
};
dfs(0,0);
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin >> n >> m >> k;
build();
vector<int> pos={1,m};
for(int i=1;i<=k;i++){
cin >> x[i] >> y[i];
pos.push_back(y[i]);
}
sort(pos.begin(),pos.end());
pos.erase(unique(pos.begin(),pos.end()),pos.end());
f[0]=1;
for(int i=0;i<(int)pos.size();i++){
int S=0;
for(int j=1;j<=k;j++) if(y[j]==pos[i]) S|=1<<(x[j]-1);
g.reset();
for(int j=0;j<(1<<n);j++) if(!(j&S)) g[j|S]=f[j];
swap(f,g);
if(i==(int)pos.size()-1){
cout << (f[(1<<n)-1]?"YES":"NO") << '\n';
return 0;
}
int d=pos[i+1]-pos[i];
d=min(d,d%6+6);
while(d--){
g.reset();
for(auto [x,y]:E) if(f[x]) g[y]=1;
swap(f,g);
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |