Submission #159380

#TimeUsernameProblemLanguageResultExecution timeMemory
159380rama_pangPaint By Numbers (IOI16_paint)C++14
59 / 100
5 ms632 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; string S; int N, K; vector<int> C; vector<int> pref_white, pref_black; vector<int> ans; //0 = undetermined, 1 = white, 2 = black, 3 = can be both vector<vector<vector<int>>> memo; inline bool check_white(int le, int ri) { //get number of white spaces in le...ri if (ri >= N) return false; if (le > ri) return true; int res = pref_white[ri]; if (le > 0) res -= pref_white[le - 1]; return (res == 0); } inline bool check_black(int le, int ri) { //get number of black spaces in le...ri if (ri >= N) return false; if (le > ri) return true; int res = pref_black[ri]; if (le > 0) res -= pref_black[le - 1]; return (res == 0); } bool dp(int n, int k, bool last_black) { if (k == K) { if (check_black(n, N - 1)) { for (int i = n; i < N; i++) ans[i] |= 1; return true; } return false; } if (n == N) return false; if (memo[n][k][last_black] != -1) return memo[n][k][last_black]; //if S[n] != '.', already determined. go next //assume S[n] = 'X' and '_'. if noth possible, '?'. 4 possibilities bool res_ = false, resX = false; if (S[n] == '_') { ans[n] |= 1; return dp(n + 1, k, false); } else if (S[n] == 'X') { if (!last_black && check_white(n, n + C[k] - 1)) { for (int i = n; i < n + C[k]; i++) ans[i] |= 2; return dp(n + C[k], k + 1, true); } else { return false; } } res_ = dp(n + 1, k, false); if (!last_black && check_white(n, n + C[k] - 1)) resX = dp(n + C[k], k + 1, true); if (res_) ans[n] |= 1; if (resX) for (int i = n; i < n + C[k]; i++) ans[i] |= 2; return memo[n][k][last_black] = (res_ || resX); } string solve_puzzle(string s, vector<int> c) { S = s; N = s.size(); K = c.size(); C = c; pref_white.resize(N); pref_black.resize(N); ans.resize(N); memo.assign(N, vector<vector<int>>(K, vector<int>(2, -1))); for (int i = 0; i < N; i++) { pref_white[i] = (S[i] == '_')? 1 : 0; if (i > 0) pref_white[i] += pref_white[i - 1]; pref_black[i] = (S[i] == 'X')? 1 : 0; if (i > 0) pref_black[i] += pref_black[i - 1]; if (S[i] == '.') { ans[i] = 0; } else if (S[i] == '_') { ans[i] = 1; } else if (S[i] == 'X') { ans[i] = 2; } } dp(0, 0, false); string res; for (int i = 0; i < N; i++) { if (ans[i] == 0) { res.push_back('E'); } else if (ans[i] == 1) { res.push_back('_'); } else if (ans[i] == 2) { res.push_back('X'); } else { res.push_back('?'); } } return res; }

Compilation message (stderr)

paint.cpp: In function 'bool dp(int, int, bool)':
paint.cpp:64:35: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     return memo[n][k][last_black] = (res_ || resX);
#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...