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;
#define int long long
#define pii pair<int, int>
const int W = (1<<6);
int w;
struct Mat{
vector<vector<bool>> v;
Mat(){
v.resize(W, vector<bool>(W));
for(int i = 0; i<W; i++){
v[i][i] = true;
}
}
};
Mat prod(Mat a, Mat b){
Mat res;
for(int i = 0;i<W; i++){
res.v[i][i] =false;
}
for(int i =0;i<W; i++){
for(int j = 0; j<W; j++){
for(int h = 0; h<W; h++){
res.v[i][j] = res.v[i][j] || (a.v[i][h] && b.v[h][j]);
}
}
}
return res;
}
Mat from_set(int ks){
Mat res;
for(int i = 0; i<W; i++){
res.v[i][i] =false;
}
for(int i =0; i<W; i++){
if((i &ks) == 0){
res.v[i][i|ks] =true;
//cout<<bitset<W>(i)<<" "<<bitset<W>(i|ks)<<endl;
}
}
/*for(int i =0; i<W; i++){
for(int j =0; j<W; j++){
cout<<res.v[i][j]<<" ";
}
cout<<endl;
}*/
return res;
}
Mat pows[31];
void precalc_pows(){
for(int i = 1; i<31; i++){
pows[i] = prod(pows[i-1], pows[i-1]);
}
}
Mat mpow(int v){
Mat res;
for(int i = 0; i<31; i++){
if(v & (1LL<<i)){
res = prod(res, pows[i]);
}
}
return res;
}
vector<Mat> Matrices;
map<int, bitset<W>> obstacles;
vector<bitset<W>> aviable;
vector<bool> found;
bitset<W> all_aviable(bitset<W> lh, bitset<W> rh){
int id = lh.to_ullong() + rh.to_ullong() * W;
if(found[id]){
return aviable[id];
}
found[id] = true;
//cout<<lh<<" "<<rh<<endl;
for(int i = 0; i<w-1; i++){
if((!lh[i]) && (!rh[i+1])){
//cout<<"possible "<<i<<endl;
lh.set(i);
rh.set(i+1);
if(!rh[i]){
rh.set(i);
aviable[id] |= all_aviable(lh, rh);
rh.reset(i);
}
if(!lh[i+1]){
lh.set(i+1);
aviable[id]|= all_aviable(lh, rh);
lh.reset(i+1);
}
lh.reset(i);
rh.reset(i+1);
}
if((!lh[i+1]) && (!rh[i])){
rh.set(i);
lh.set(i+1);
if(!lh[i]){
lh.set(i);
aviable[id] |= all_aviable(lh, rh);
lh.reset(i);
}
if(!rh[i+1]){
rh.set(i+1);
aviable[id]|= all_aviable(lh, rh);
rh.reset(i+1);
}
rh.reset(i);
lh.reset(i+1);
}
}
return aviable[id];
}
vector<bitset<W>> interest;
signed main(){
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int h, k;
cin>>w>>h>>k;
if(w>6){
if((w*k)%6LL == 0){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}
aviable.resize(W*W);
found.resize(W*W);
bitset<W> lh;
for(int i = 0; i<w; i++){
lh.set(i);
}
for(int rh = 0; rh<W; rh++){
int id = lh.to_ullong() + rh*W;
aviable[id].set(rh);
found[id] =true;
}
Mat transition;
for(int lhi = 0; lhi<W; lhi++){
interest.push_back(all_aviable(bitset<W>(lhi), bitset<W>(0)));
for(int rh = 0; rh<W; rh++){
transition.v[lhi][rh] = interest[lhi][rh];
}
}
pows[0] = transition;
precalc_pows();
for(int i = 0; i<k; i++){
int a, b;
cin>>a>>b;
a--;
b--;
obstacles[b].set(a);
}
if(obstacles.find(h-1) == obstacles.end()){
obstacles[h-1] = bitset<W>(0);
}
Mat res;
int cur_id = 0;
for(auto e: obstacles){
res = prod(res, mpow(e.first-cur_id));
cur_id = e.first;
res = prod(res, from_set(e.second.to_ullong()));
}
if(res.v[0][(1<<w)-1]){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
# | 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... |