# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1247540 | julia_08 | Paint By Numbers (IOI16_paint) | C++20 | 275 ms | 176772 KiB |
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
const int MAXK = 110;
int dp_pref[MAXN][MAXK], dp_suf[MAXN][MAXK];
int sum_b[MAXN], sum_w[MAXN];
int white[MAXN], black[MAXN];
string solve_puzzle(string s, vector<int> c){
int n = s.size();
int k = c.size();
s = " " + s;
for(int i=1; i<=n; i++){
sum_b[i] = sum_b[i - 1] + (s[i] == 'X');
sum_w[i] = sum_w[i - 1] + (s[i] == '_');
}
dp_pref[0][0] = 1;
for(int i=1; i<=n; i++){
for(int j=0; j<=k; j++){
// black
if(j > 0){
if(i == c[j - 1]){
dp_pref[i][j] |= (dp_pref[i - c[j - 1]][j - 1] && (sum_w[i] - sum_w[i - c[j - 1]] == 0));
}
if(i > c[j - 1]){
dp_pref[i][j] |= (dp_pref[i - c[j - 1] - 1][j - 1] && (sum_w[i] - sum_w[i - c[j - 1]] == 0) && s[i - c[j - 1]] != 'X');
}
}
// white
if(s[i] != 'X') dp_pref[i][j] |= dp_pref[i - 1][j];
}
}
dp_suf[n + 1][0] = 1;
for(int i=n; i>=1; i--){
for(int j=0; j<=k; j++){
// black
if(j > 0){
if(i + c[k - j] - 1 == n){
dp_suf[i][j] |= (dp_suf[i + c[k - j]][j - 1] && (sum_w[i + c[k - j] - 1] - sum_w[i - 1] == 0));
}
if(i + c[k - j] - 1 < n){
dp_suf[i][j] |= (dp_suf[i + c[k - j] + 1][j - 1] && (sum_w[i + c[k - j] - 1] - sum_w[i - 1] == 0) && s[i + c[k - j]] != 'X');
}
}
// white
if(s[i] != 'X') dp_suf[i][j] |= dp_suf[i + 1][j];
}
}
for(int i=1; i<=n; i++){
for(int j=0; j<=k; j++){
// black
if(j > 0){
bool can_pref = false;
bool can_suf = false;
if(i == c[j - 1]){
can_pref = (dp_pref[0][j - 1] && (sum_w[i] - sum_w[i - c[j - 1]] == 0));
} else if(i > c[j - 1]){
can_pref = (dp_pref[i - c[j - 1] - 1][j - 1] && (s[i - c[j - 1]] != 'X') && (sum_w[i] - sum_w[i - c[j - 1]] == 0));
}
if(i < n - 1){
can_suf = (dp_suf[i + 2][k - j] && (s[i + 1] != 'X'));
} else if(i == n - 1){
can_suf = ((j == k) && (s[i + 1] != 'X'));
} else if(i == n) can_suf = (j == k);
if(can_pref && can_suf){
black[i - c[j - 1] + 1] ++;
black[i + 1] --;
}
}
// white
if(s[i] != 'X') white[i] |= (dp_pref[i - 1][j] && dp_suf[i + 1][k - j]);
}
}
for(int i=1; i<=n; i++) black[i] += black[i - 1];
string ans;
for(int i=1; i<=n; i++){
if(black[i] && white[i]){
ans.push_back('?');
} else if(black[i]){
ans.push_back('X');
} else ans.push_back('_');
}
return ans;
}
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... |