제출 #290183

#제출 시각아이디문제언어결과실행 시간메모리
290183KastandaPaint By Numbers (IOI16_paint)C++11
100 / 100
1442 ms174848 KiB
// M #include<bits/stdc++.h> #include "paint.h" using namespace std; const int N = 200015, K = 109; int n, k, C[N], W[N], dp[N][K], pd[N][K], CW[N], CB[N]; string S; string solve_puzzle(string _S, vector< int > _C) { n = (int)_S.size(); k = (int)_C.size(); S = "_" + _S + "_____"; for (int i = 1; i <= k; i ++) C[i] = _C[i - 1]; for (int i = 1; i <= n; i ++) W[i] = W[i - 1] + (S[i] == '_'); for (int i = 0; i <= n + 3 && S[i] != 'X'; i ++) dp[i][0] = 1; for (int i = n + 3; i >= 0 && S[i] != 'X'; i --) pd[i][k + 1] = 1; for (int j = 1; j <= k; j ++) for (int i = C[j]; i <= n; i ++) { if (W[i] - W[i - C[j]] == 0) { if (j == 1) dp[i][j] = dp[i - C[j]][j - 1]; else if (i > C[j] && S[i - C[j]] != 'X' && dp[i - C[j] - 1][j - 1]) dp[i][j] = 1; } if (S[i] != 'X') dp[i][j] |= dp[i - 1][j]; } for (int j = k; j; j --) for (int i = n - C[j] + 1; i; i --) { if (W[i + C[j] - 1] - W[i - 1] == 0) { if (j == k) pd[i][j] = pd[i + C[j]][j + 1]; else if (i <= n - C[j] && S[i + C[j]] != 'X' && pd[i + C[j] + 1][j + 1]) pd[i][j] = 1; } if (S[i] != 'X') pd[i][j] |= pd[i + 1][j]; } for (int j = 1; j <= k; j ++) for (int i = C[j]; i <= n; i ++) { bool le = 0; if (j == 1) le = dp[i - C[j]][j - 1]; else if (i > C[j] && S[i - C[j]] != 'X' && dp[i - C[j] - 1][j - 1]) le = 1; le &= (W[i] - W[i - C[j]] == 0); if (le && S[i + 1] != 'X' && pd[i + 2][j + 1]) CB[i - C[j] + 1] ++, CB[i + 1] --; } for (int j = 0; j <= k; j ++) for (int i = 1; i <= n; i ++) if (S[i] != 'X' && dp[i - 1][j] && pd[i + 1][j + 1]) CW[i] ++, CW[i + 1] --; string Rs; for (int i = 1; i <= n; i ++) { CW[i] += CW[i - 1]; CB[i] += CB[i - 1]; if (S[i] != '.') Rs += S[i]; else if (CB[i] && CW[i]) Rs += "?"; else if (CB[i]) Rs += "X"; else Rs += "_"; } return Rs; }
#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...