Submission #386441

#TimeUsernameProblemLanguageResultExecution timeMemory
386441ACmachinePaint By Numbers (IOI16_paint)C++17
100 / 100
916 ms175428 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template<typename T, typename U> using ordered_map = tree<T, U, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<int> vi; typedef vector<ll> vll; #define FOR(i,j,k,in) for(int i=(j); i < (k);i+=in) #define FORD(i,j,k,in) for(int i=(j); i >=(k);i-=in) #define REP(i,b) FOR(i,0,b,1) #define REPD(i,b) FORD(i,b,0,1) #define pb push_back #define mp make_pair #define ff first #define ss second #define all(x) begin(x), end(x) #define MANY_TESTS int tcase; cin >> tcase; while(tcase--) const double EPS = 1e-9; const int MOD = 1e9+7; const ll INFF = 1e18; const int INF = 1e9; const ld PI = acos((ld)-1); const vi dy = {1, 0, -1, 0, -1, 1, 1, -1}; const vi dx = {0, 1, 0, -1, -1, 1, -1, 1}; void DBG(){cout << "]" << endl;} template<typename T, typename ...U> void DBG(const T& head, const U... args){ cout << head << "; "; DBG(args...); } #define dbg(...) cout << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__); #define chk() cout << "Check at line(" << __LINE__ << ") hit." << endl; template<class T, unsigned int U> ostream& operator<<(ostream& out, const array<T, U> &v){out << "["; REP(i, U) out << v[i] << ", "; out << "]"; return out;} template <class T, class U> ostream& operator<<(ostream& out, const pair<T, U> &par) {out << "[" << par.first << ";" << par.second << "]"; return out;} template <class T> ostream& operator<<(ostream& out, const set<T> &cont) { out << "{"; for( const auto &x:cont) out << x << ", "; out << "}"; return out; } template <class T, class U> ostream& operator<<(ostream& out, const map<T, U> &cont) {out << "{"; for( const auto &x:cont) out << x << ", "; out << "}"; return out; } template<class T> ostream& operator<<(ostream& out, const vector<T> &v){ out << "["; REP(i, v.size()) out << v[i] << ", "; out << "]"; return out;} template<class T> istream& operator>>(istream& in, vector<T> &v){ for(auto &x : v) in >> x; return in; } std::string solve_puzzle(std::string s, std::vector<int> c) { int k = c.size(); int n = (int)s.length(); auto solve_dp = [&](string ts){ vector<vector<int>> dp(n + 1, vector<int>(k + 1, 0)); vector<int> ps(n + 1); ps[0] = 0; FOR(i, 1, n + 1, 1){ ps[i] += ps[i - 1]; if(ts[i - 1] != '_') ps[i]++; } dp[0][0] = 1; FOR(i, 1, n + 1, 1){ REP(j, k + 1){ if(dp[i - 1][j] && ts[i - 1] != 'X') dp[i][j] = 1; if(j == 0) continue; bool can1 = false; int lst = i - c[j - 1]; if(lst < 0) continue; if(lst >= 0 && ps[i] - ps[lst] == c[j - 1]) can1 = true; bool can2 = false; if(lst == 0 || ts[lst - 1] != 'X') can2 = true; if(can1 && can2){ if(lst == 0){ if(j == 1) dp[i][j] = 1; } else if(dp[lst - 1][j - 1]) dp[i][j] = 1; } } } return dp; }; string ans(n, '?'); vector<int> ps(n + 1); ps[0] = 0; FOR(i, 1, n + 1, 1){ ps[i] += ps[i - 1]; if(s[i - 1] != '_') ps[i]++; } /* REP(i, n){ if(s[i] == 'X') ans[i] = 'X'; else if(s[i] == '_') ans[i] = '_'; else{ ns[i] = 'X'; auto dp = solve_dp(ns); bool canx = dp[n][k]; ns[i] = '_'; dp = solve_dp(ns); bool cany = dp[n][k]; ns[i] = s[i]; if(canx && !cany) ans[i] = 'X'; else if(cany && !canx) ans[i] = '_'; } } */ auto dp1 = solve_dp(s); reverse(all(s)); reverse(all(c)); auto dp2 = solve_dp(s); reverse(all(dp2)); vector<bool> canx(n, false); vector<bool> cany(n, false); reverse(all(c)); reverse(all(s)); REP(i, k){ int pp = 0; REP(j, n - c[i] + 1){ int right = j + c[i]; bool can3 = false; if(ps[right] - ps[j] == c[i]) can3 = true; bool can1 = false; if(j == 0){ if(i == 0) can1 = true; } else{ if(s[j - 1] != 'X' && dp1[j - 1][i]) can1 = true; } bool can2 = false; if(right == n){ if(i == k - 1) can2 = true; } else{ if(s[right] != 'X' && dp2[right + 1][k - (i + 1)]) can2 = true; } if(can1 && can2 && can3){ pp = max(pp, j); while(pp < right){ canx[pp] = true; pp++; } } } } REP(i, n){ REP(j, k + 1){ if(dp1[i][j] && dp2[i + 1][(k - j)]) cany[i] = true; } } REP(i, n){ if(s[i] == 'X') ans[i] = 'X'; else if(s[i] == '_') ans[i] = '_'; else{ if(canx[i] && !cany[i]) ans[i] = 'X'; else if(cany[i] && !canx[i]) ans[i] = '_'; } } 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...