Submission #42783

#TimeUsernameProblemLanguageResultExecution timeMemory
42783funcsrPaint By Numbers (IOI16_paint)C++14
100 / 100
306 ms48284 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++) #define INF 1145141919 int N, K; int C[100]; bool dpL[200010][101], dpR[200010][101]; int white[200010], black[200010]; 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); } int W[101]; string solve_puzzle(string S, vector<int> c) { S = '_'+S+'_'; N = S.length(); K = c.size(); rep(i, K) C[i] = c[i]; string O(S); rep(i, N+1) rep(j, K+1) dpL[i][j] = false, dpR[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]; dpL[0][0] = true; rep(i, N) { if (range_black(i, i)) continue; rep(k, K+1) dpL[i+1][k] |= dpL[i][k]; rep(k, K) { int l = i-C[k]; if (range_white(l, i-1) == 0) dpL[i+1][k+1] |= dpL[l][k]; } } assert(dpL[N][K]); dpR[N-1][K] = true; for (int i=N-1; i>0; i--) { if (range_black(i, i)) continue; rep(k, K+1) dpR[i-1][k] |= dpR[i][k]; for (int k=1; k<=K; k++) { int r = i+C[k-1]; if (range_white(i+1, r) == 0) dpR[i-1][k-1] |= dpR[r][k]; } } rep(i, K) W[i] = -INF; rep(i, N) { bool can_be_white = false, can_be_black = false; rep(k, K) { int pos = i-1, c = C[k]; if (pos+c<N && range_white(pos+1, pos+c)==0 && dpL[pos+1][k] && dpR[pos+c][k+1]) W[k] = pos; can_be_black |= (i-C[k]) <= W[k]; } if (S[i] != '.') continue; rep(k, K+1) can_be_white |= dpL[i+1][k] && dpR[i-1][k]; //cout<<"i="<<i<<": white="<<can_be_white<<", black="<<can_be_black<<"\n"; assert(can_be_white || can_be_black); if (!can_be_white) O[i] = 'X'; else if (!can_be_black) O[i] = '_'; else O[i] = '?'; } O.erase(O.begin()), 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...