Submission #42773

#TimeUsernameProblemLanguageResultExecution timeMemory
42773funcsrPaint By Numbers (IOI16_paint)C++14
80 / 100
2056 ms1668 KiB
#include "paint.h" #include <iostream> #include <vector> #include <string> #include <cassert> using namespace std; #define rep(i, n) for (int i=0; i<(n); i++) int N, K; int C[100]; bool dp[100001][101]; int white[100001], black[100001]; inline int range_white(int l, int r) { return white[r]-(l>0?white[l-1]:0); } inline int range_black(int l, int r) { return black[r]-(l>0?black[l-1]:0); } bool f(string S) { rep(i, N+1) rep(j, K+1) dp[i][j] = false; rep(i, N) white[i] = S[i]=='_', black[i] = S[i]=='X'; rep(i, N-1) white[i+1] += white[i], black[i+1] += black[i]; dp[0][0] = true; rep(i, N) { if (range_black(i, i)) continue; rep(k, K+1) dp[i+1][k] |= dp[i][k]; rep(k, K) { int l = i-C[k]; if (range_white(l, i-1) == 0) dp[i+1][k+1] |= dp[l][k]; } } return dp[N][K]; } string solve_puzzle(string S, vector<int> c) { S += '_'; N = S.length(); K = c.size(); rep(i, K) C[i] = c[i]; string O(S); assert(f(S)); rep(i, N) { if (S[i] != '.') continue; S[i] = 'X'; if (!f(S)) { O[i] = '_'; } else { S[i] = '_'; if (!f(S)) { O[i] = 'X'; } else { O[i] = '?'; } } S[i] = '.'; } O.pop_back(); return O; }
#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...