Submission #135871

#TimeUsernameProblemLanguageResultExecution timeMemory
135871KastandaPaint By Numbers (IOI16_paint)C++11
100 / 100
1020 ms103772 KiB
// ItnoE #include<bits/stdc++.h> using namespace std; const int N = 200005, K = 109; int X[N], U[N], W[N], B[N], M[K][N]; bool dp[K][N]; string solve_puzzle(string S, vector < int > C) { int n = (int)S.size(); int k = (int)C.size(); S = '.' + S; C.insert(C.begin(), 0); for (int i = 1; i <= n; i ++) { X[i] = X[i - 1] + (S[i] != '_'); U[i] = U[i - 1] + (S[i] != 'X'); } dp[0][0] = 1; for (int j = 0; j <= k; j ++) for (int i = 1; i <= n; i ++) { if (S[i] != 'X' && dp[j][i - 1]) dp[j][i] = 1; if (j == 1 && i == C[j] && X[i] - X[i - C[j]] == C[j]) dp[j][i] = 1; if (j && i > C[j] && X[i] - X[i - C[j]] == C[j] && S[i - C[j]] != 'X' && dp[j - 1][i - C[j] - 1]) dp[j][i] = 1; } assert(dp[k][n]); queue < pair < int , int > > qu; qu.push({n, k}); while (qu.size()) { int i = qu.front().first; int j = qu.front().second; qu.pop(); if (M[j][i]) continue; M[j][i] = 1; if (S[i] != 'X' && dp[j][i - 1]) qu.push({i - 1, j}), W[i] ++, W[i + 1] --; if (j == 1 && i == C[j] && X[i] - X[i - C[j]] == C[j]) B[1] ++, B[i + 1] --; if (j && i > C[j] && X[i] - X[i - C[j]] == C[j] && S[i - C[j]] != 'X' && dp[j - 1][i - C[j] - 1]) qu.push({i - C[j] - 1, j - 1}), B[i - C[j] + 1] ++, B[i + 1] --, W[i - C[j]] ++, W[i - C[j] + 1] --; } string R = ""; for (int i = 1; i <= n; i ++) { W[i] += W[i - 1]; B[i] += B[i - 1]; if (W[i] && !B[i]) R += '_'; else if (B[i] && !W[i]) R += 'X'; else R += '?'; } return (R); }
#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...