Submission #753921

#TimeUsernameProblemLanguageResultExecution timeMemory
753921lohachoL-triominoes (CEOI21_ltriominoes)C++14
100 / 100
562 ms97836 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #define mi(x, y) (x = min(x, y)) #define ma(x, y) (x = max(x, y)) using namespace std; const int NS = 13; int way[(1 << NS) + 4][(1 << NS) + 4]; vector<int> vway[(1 << NS) + 4]; int dist[(1 << NS) + 4]; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int w, h, k; cin >> w >> h >> k; vector<pair<int, int>> a(k); for(int i = 0; i < k; ++i){ cin >> a[i].first >> a[i].second; swap(a[i].first, a[i].second); --a[i].first, --a[i].second; } sort(a.begin(), a.end()); for(int i = 0; i < (1 << w); ++i){ auto dfs = [&](auto&&self, int x, int bt)->void{ int now = (i >> x & 1); if(now){ self(self, x + 1, bt); return; } if(x == w){ way[i][bt] = 1; return; } int nxt = (i >> (x + 1) & 1); int btnow = (bt >> x & 1); if(x + 1 < w && !nxt && !btnow){ self(self, x + 2, bt | 1 << x); } if(x + 1 < w && !nxt){ self(self, x + 2, bt | 1 << (x + 1)); } if(x + 1 < w && !btnow){ self(self, x + 1, bt | 1 << x | 1 << (x + 1)); } if(!btnow && x && !(bt >> (x - 1) & 1)){ self(self, x + 1, bt | 1 << x | 1 << (x - 1)); } }; dfs(dfs, 0, 0); for(int j = 0; j < (1 << w); ++j){ if(way[i][j]){ vway[i].push_back(j); } } } vector<int> dp(1 << w); int p = 0, bt = 0; while(p < k && a[p].first == 0){ bt |= (1 << a[p].second); ++p; } dp[bt] = 1; for(int i = 1; i < h; ++i){ int nxt = h - 1; if(p < k) nxt = a[p].first; int add = (nxt - 2 - i) / 6; if(add > 0) i += add * 6; bt = 0; while(p < k && a[p].first == i){ bt |= (1 << a[p].second); ++p; } vector<int> ndp(1 << w); for(int j = 0; j < (1 << w); ++j){ if(!dp[j]) continue; for(auto&nxt:vway[j]){ //cout << i << ' ' << j << ' ' << nxt << ' ' << bt << endl; if(!(nxt & bt)){ ndp[nxt | bt] = 1; } } } swap(dp, ndp); } if(dp[(1 << w) - 1]){ cout << "YES\n"; } else{ cout << "NO\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...