이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "paint.h"
#include<cstdlib>
#include<iostream>
#include<vector>
#include<string>
#include<bitset>
#define DIM 200005
using namespace std;
static string sol;
static int sum[DIM], ff[DIM];
static short df[103][DIM], ds[103][DIM];
string solve_puzzle(string c, vector<int> v) {
int n, k, i, j, ok;
n = c.size();
k = v.size();
c += '0';
v.push_back(0);
for(i = n; i >= 1; i--){
c[i] = c[i - 1];
}
for(i = k; i >= 1; i--){
v[i] = v[i - 1];
}
for(i = 1; i <= n; i++){
sum[i] = sum[i - 1];
if(c[i] == '_'){
sum[i]++;
}
}
df[0][0] = 1;
for(i = 0; i <= k; i++){
for(j = 1; j <= n; j++){
if(c[j] != 'X' && df[i][j - 1] == 1){
df[i][j] = 1;
}
if(j >= v[i] && sum[j] - sum[ j - v[i] ] == 0 && df[i - 1][ max(0, j - v[i] - 1) ] == 1){
df[i][j] = 1;
}
}
}
ds[k + 1][n + 1] = 1;
v.push_back(0);
for(i = k + 1; i >= 1; i--){
for(j = n; j >= 1; j--){
if(c[j] != 'X' && ds[i][j + 1] == 1){
ds[i][j] = 1;
}
if(j + v[i] - 1 <= n && sum[j + v[i] - 1] - sum[j - 1] == 0 && ds[i + 1][ min(j + v[i] + 1, n + 1) ] == 1){
ds[i][j] = 1;
if(df[i - 1][ max(0, j - 2) ] == 1){
ff[j]++;
ff[ j + v[i] ]--;
}
}
}
}
for(i = 1; i <= n; i++){
ff[i] += ff[i - 1];
ok = 0;
for(j = 0; j <= k; j++){
if(df[j][i - 1] == 1 && ds[j + 1][i + 1] == 1){
ok = 1;
}
}
if(c[i] == 'X'){
ok = 0;
}
if(ok == 1 && ff[i] > 0){
sol += '?';
}
else{
if(ok == 1){
sol += '_';
}
else{
sol += 'X';
}
}
}
return sol;
}
# | 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... |