# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
33971 | imeimi2000 | Paint By Numbers (IOI16_paint) | C++14 | 1916 ms | 242336 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "paint.h"
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long llong;
int n, k;
int dp1[200001][101];
int dp2[200002][102];
int dp3[200001][101];
int sumB[200001];
int sumW[200001];
char str[200002];
vector<int> block;
string solve_puzzle(string s, vector<int> c) {
char trans[256];
trans['.'] = 'N';
trans['X'] = 'B';
trans['_'] = 'W';
n = s.length(); k = c.size();
block.resize(k + 1);
for (int i = 1; i <= n; ++i) str[i] = trans[s[i - 1]];
for (int i = 1; i <= k; ++i) block[i] = c[i - 1];
for (int i = 1; i <= n; ++i) {
sumB[i] = sumB[i - 1] + (str[i] == 'B');
sumW[i] = sumW[i - 1] + (str[i] == 'W');
}
dp1[0][0] = true;
for (int i = 1; i <= n; ++i) {
dp1[i][0] = (sumB[i] == 0);
dp1[i][1] = (i > 1 && dp1[i - 1][1] && str[i] != 'B')
|| (i >= block[1] && sumW[i] == sumW[i - block[1]] && sumB[i - block[1]] == 0);
}
for (int i = 2; i <= k; ++i) {
for (int j = block[i] + 2; j <= n; ++j) {
dp1[j][i] = (j > 1 && str[j] != 'B' && dp1[j - 1][i])
|| (j > block[i] + 1 && str[j - block[i]] != 'B'
&& sumW[j - block[i]] == sumW[j] && dp1[j - block[i] - 1][i - 1]);
}
}
dp2[n + 1][k + 1] = true;
for (int i = n; i >= 1; --i) {
dp2[i][k + 1] = (sumB[i - 1] == sumB[n]);
dp2[i][k] = (i > 1 && dp2[i + 1][k] && str[i] != 'B')
|| (i <= n - block[k] + 1 && sumW[i - 1] == sumW[i + block[k] - 1]
&& sumB[i + block[k] - 1] == sumB[n]);
}
for (int i = k - 1; i > 0; --i) {
for (int j = n - block[i] - 1; j > 0; --j) {
dp2[j][i] = (j < n && str[j] != 'B' && dp2[j + 1][i])
|| (j < n - block[i] && str[j + block[i]] != 'B'
&& sumW[j + block[i] - 1] == sumW[j - 1] && dp2[j + block[i] + 1][i + 1]);
}
}
if (k == 1) {
for (int i = block[1]; i <= n; ++i) {
dp3[i][1] = (sumW[i] == sumW[i - block[1]]
&& sumB[i - block[1]] == 0 && sumB[i] == sumB[n]);
dp3[i][1] += dp3[i - 1][1];
}
}
else {
for (int i = 1; i <= n; ++i) {
dp3[i][k] = (i > block[k] && dp1[i - block[k] - 1][k - 1]
&& sumW[i] == sumW[i - block[k]] && sumB[i] == sumB[n]
&& str[i - block[k]] != 'B');
dp3[i][k] += dp3[i - 1][k];
dp3[i][1] = (i >= block[1] && sumW[i] == sumW[i - block[1]]
&& sumB[i - block[1]] == 0 && i < n && dp2[i + 2][2]
&& str[i + 1] != 'B');
dp3[i][1] += dp3[i - 1][1];
}
}
for (int i = 2; i < k; ++i) {
for (int j = 1; j <= n; ++j) {
dp3[j][i] = (j > block[i] && j < n && dp1[j - block[i] - 1][i - 1]
&& dp2[j + 2][i + 1] && sumW[j] == sumW[j - block[i]]
&& str[j - block[i]] != 'B' && str[j + 1] != 'B');
dp3[j][i] += dp3[j - 1][i];
}
}
int j;
for (int i = 1; i <= n; ++i) {
if (str[i] != 'N') continue;
for (j = 0; j <= k; ++j) {
if (dp1[i - 1][j] && dp2[i + 1][j + 1]) break;
}
if (j > k) str[i] = 'B';
}
for (int i = 1; i <= n; ++i) {
if (str[i] != 'N') continue;
for (j = 1; j <= k; ++j) {
if (dp3[min(n, i + block[j] - 1)][j] - dp3[i - 1][j] != 0) break;
}
if (j > k) str[i] = 'W';
}
string ret = "";
trans['N'] = '?';
trans['B'] = 'X';
trans['W'] = '_';
for (int i = 1; i <= n; ++i) ret.push_back(trans[str[i]]);
return ret;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |