제출 #66328

#제출 시각아이디문제언어결과실행 시간메모리
66328aquablitz11Paint By Numbers (IOI16_paint)C++14
100 / 100
378 ms95072 KiB
#include <bits/stdc++.h> #include "paint.h" using namespace std; const char any = '.'; const char white = '_'; const char black = 'X'; const char both = '?'; const int N = 200010; const int K = 110; int wqs[N], bqs[N]; bool dp[N][K], pb[N][K], pw[N][K], reach[N][K]; string solve_puzzle(string s, vector<int> c) { int n = s.size(); int k = c.size(); s.insert(s.begin(), '\0'); c.insert(c.begin(), 0); for (int i = 1; i <= n; ++i) { wqs[i] = wqs[i-1]; if (s[i] == white) ++wqs[i]; } dp[n+1][k+1] = true; for (int i = n; i >= 1; --i) { for (int j = k+1; j >= 1; --j) { if (j <= k && (s[i] == black || s[i] == any)) { bool blackstrip = i+c[j]-1 <= n && wqs[i+c[j]-1]-wqs[i-1] == 0; bool nextwhite = i+c[j] > n || s[i+c[j]] != black; bool nextdp = dp[min(n+1, i+c[j]+1)][j+1]; if (blackstrip && nextwhite && nextdp) { pb[i][j] = true; dp[i][j] = true; } } if ((s[i] == white || s[i] == any) && dp[i+1][j]) { pw[i][j] = true; dp[i][j] = true; } //printf("dp[%d][%d] = %d (W=%d, B=%d)\n", i, j, dp[i][j]?1:0, pw[i][j]?1:0, pb[i][j]?1:0); } } for (int i = 1; i <= n; ++i) wqs[i] = 0; reach[1][1] = true; for (int i = 1; i <= n+1; ++i) { for (int j = 1; j <= k+1; ++j) if (reach[i][j] && dp[i][j]) { if (pb[i][j]) { bqs[i] += 1; bqs[i+c[j]] -= 1; wqs[i+c[j]] = 1; reach[min(n+1, i+c[j]+1)][j+1] = true; } if (pw[i][j]) { wqs[i] = 1; reach[i+1][j] = true; } } } string ans(n, '\0'); for (int i = 1; i <= n; ++i) { bqs[i] += bqs[i-1]; if (wqs[i] && bqs[i]) ans[i-1] = both; else if (wqs[i]) ans[i-1] = white; else ans[i-1] = black; } return ans; }
#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...