Submission #226257

#TimeUsernameProblemLanguageResultExecution timeMemory
226257staniewzkiPaint By Numbers (IOI16_paint)C++17
100 / 100
499 ms8856 KiB
#include<bits/stdc++.h> using namespace std; #define REP(i, n) for(int i = 0; i < n; i++) #define FOR(i, a, b) for(int i = a; i <= b; i++) #define ST first #define ND second ostream& operator<<(ostream &out, string str) { for(char c : str) out << c; return out; } template<class L, class R> ostream& operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.ST << ", " << p.ND << ")"; } template<class T> auto operator<<(ostream &out, T a) -> decltype(a.begin(), out) { out << "{"; for(auto it = a.begin(); it != a.end(); it = next(it)) out << (it != a.begin() ? ", " : "") << *it; return out << "}"; } void dump() { cerr << "\n"; } template<class T, class... Ts> void dump(T a, Ts... x) { cerr << a << ", "; dump(x...); } #ifdef DEBUG # define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__) #else # define debug(...) false #endif template<class T> int size(T && a) { return (int) a.size(); } using LL = long long; using PII = pair<int, int>; #include "paint.h" string solve_puzzle(string s, vector<int> c) { int n = size(s), k = size(c); vector<int> w(n); REP(i, n) w[i] = (s[i] == '_') + (i != 0 ? w[i - 1] : 0); auto get = [&](int l, int r) { return w[r] - (l != 0 ? w[l - 1] : 0); }; vector<vector<bool>> suff(k + 1, vector<bool>(n + 1)); suff[k][n] = true; for(int i = k; i >= 0; i--) { for(int j = n - 1; j >= 0; j--) { if(s[j] != 'X' && suff[i][j + 1]) suff[i][j] = true; if(i < k) { int r = j + c[i] - 1; if(n <= r || get(j, r)) continue; if(i < k - 1 && (n <= r + 1 || s[r + 1] == 'X')) continue; if(suff[i + 1][(i < k - 1 ? r + 1 : r) + 1]) suff[i][j] = true; } } } vector<int> f(n + 1), e(n + 1); vector<vector<bool>> pref(k + 1, vector<bool>(n + 1)); pref[0][0] = true; REP(i, k + 1) REP(j, n) { if(!pref[i][j]) continue; if(s[j] != 'X') { pref[i][j + 1] = true; if(suff[i][j + 1]) e[j] = true; } if(i < k) { int r = j + c[i] - 1; if(n <= r || get(j, r)) continue; if(i < k - 1 && (n <= r + 1 || s[r + 1] == 'X')) continue; int p = (i < k - 1 ? r + 1 : r); pref[i + 1][p + 1] = true; if(suff[i + 1][p + 1]) { f[j]++, f[r + 1]--; if(i < k - 1) e[p] = true; } } } FOR(i, 1, n) f[i] += f[i - 1]; string ans; REP(i, n) { if(e[i] && f[i]) ans += "?"; else if(e[i]) ans += "_"; else ans += "X"; } return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...