| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1354694 | semiauto | Paint By Numbers (IOI16_paint) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
vector <vector <bool> > calc_dp(string s, vector <int> a) {
int n = s.size();
int k = blocks.size();
vector <int> white(n + 1);
for (int i = 1; i <= n; i++) {
white[i] = white[i - 1];
if (s[i - 1] == '_') {
white[i]++;
}
}
vector <vector <bool> > dp(n + 1, vector<bool>(k + 1));
dp[0][0] = true;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (s[i] != 'X' && dp[i - 1][j]) {
dp[i][j] = true;
}
if (j > 0 && i >= a[j - 1] && white[i] == white[i - a[j - 1]]) {
if (i == a[j - 1] && j == 1) {
dp[i][j] = true;
} else if (i - a[j - 1] - 1 >= 0 && s[i - a[j - 1]] != 'X'
&& dp[i - a[j - 1] - 1][j - 1]) {
dp[i][j] = true;
}
}
}
}
return dp;
}
string solve_puzzle(string s, vector <int> a) {
vector <vector <bool> > left_dp = calc_dp(s, a);
reverse(s.begin(), s.end());
reverse(a.begin(), a.end());
vector <vector <bool> > right_dp = calc_dp(s, a);
reverse(s.begin(), s.end());
reverse(a.begin(), a.end());
int n = s.size();
int k = a.size();
s = '#' + s;
vector <int> white(n + 1);
for (int i = 1; i <= n; i++) {
white[i] = white[i - 1];
if (s[i - 1] == '_') {
white[i]++;
}
}
vector <int> v(n + 1);
for (int i = 1; i <= n; i++) {
int ok = 0;
for (int j = 0; j <= k; j++) {
if (s[i] != 'X' && left_dp[i - 1][j] && right_dp[n - i][k - j]) {
ok = 1;
}
}
v[i] += ok;
}
vector <int> sum(n + 2);
for (int j = 1; j <= k; j++) {
for (int i = a[j - 1]; i <= n; i++) {
if (white[i] > white[i - a[j - 1]]) {
continue;
}
bool left = (j == 1 && i == a[j - 1]);
if (i - a[j - 1] - 1 > 0 && s[i - a[j - 1]] != 'X' &&
left_dp[i - a[j - 1] - 1][j - 1]) {
left = true;
}
bool right = (j == k && i == n);
if (i + 1 <= n && s[i + 1] != 'X' &&
right_dp[n - i - 1][k - j]) {
right = true;
}
if (left && right) {
sum[i - a[j - 1] + 1]++;
sum[i + 1]--;
}
}
}
for (int i = 1; i <= n; i++) {
sum[i] += sum[i - 1];
if (sum[i] > 0) {
v[i] += 2;
}
}
string ans = "";
for (int i = 1; i <= n; i++) {
if (v[i] == 1) {
ans += '_';
}
if (v[i] == 2) {
ans += 'X';
}
if (v[i] == 3) {
ans += '?';
}
}
return ans;
}
