Submission #1365782

#TimeUsernameProblemLanguageResultExecution timeMemory
1365782retardePaint By Numbers (IOI16_paint)C++20
100 / 100
273 ms84948 KiB
#include "paint.h"
#include <bits/stdc++.h>
#include <cstdlib>
using namespace std;

int n, k;
const int mxn = 200005, mxk = 105;

static bool dp[mxn][mxk][2], dp2[mxn][mxk][2];

bool ok(int l, int r, vector<char> &s_u, vector<int> &p) {
    if (p[r] - p[l - 1]) return false;
    if (s_u[r + 1] == 'X' || s_u[l - 1] == 'X') return false;
    return true;
}

void do_dp(bool dp[mxn][mxk][2], vector<char> &s_u, vector<int> &c_u) {
    vector<int> p(n + 5);
    for (int i = 1; i <= n; i++) p[i] = p[i - 1] + (s_u[i] == '_');

    dp[0][0][0] = 1; dp[0][0][1] = 1;
    for (int i = 1; i <= n; i++) {
        if (s_u[i] != 'X') {
            dp[i][0][0] = dp[i - 1][0][0];
            dp[i][0][1] = dp[i - 1][0][1];
        }

        for (int j = 1; j <= k; j++) {
            if (s_u[i] != 'X') {
                dp[i][j][0] = (dp[i - 1][j][0] || dp[i - 1][j][1]);
            }
            if (s_u[i] != '_') {
                if (i >= c_u[j]) {
                    if (ok(i - c_u[j] + 1, i, s_u, p)) {
                        dp[i][j][1] = dp[i - c_u[j]][j - 1][0];
                    }
                }
            }
        }
    }
}

string solve_puzzle(string si, vector<int> ci) {
    n = (int)si.size(); k = (int)ci.size();

    vector<char> s_norm(n + 5, '!'), s_rev(n + 5, '!');
    vector<int> c_norm, c_rev;

    for (int i = 1; i <= n; i++) s_norm[i] = si[i - 1];
    for (int i = n; i >= 1; i--) s_rev[i] = si[n - i];

    c_norm.push_back(-1e9);
    for (auto &x : ci) c_norm.push_back(x);

    c_rev.push_back(-1e9);
    for (int i = k - 1; i >= 0; i--) c_rev.push_back(ci[i]);

    do_dp(dp, s_norm, c_norm);
    do_dp(dp2, s_rev, c_rev);

    vector<char> w(n + 5), bk(n + 5);
    vector<int> d(n + 6);

    for (int i = 1; i <= n; i++) {
        if (si[i - 1] != '.') {
            if (si[i - 1] == '_') w[i] = 1;
            else bk[i] = 1;
            continue;
        }

        for (int bl = 0; bl <= k; bl++) {
            int br = k - bl;
            if (dp[i][bl][0] && dp2[n - i + 1][br][0]) w[i] = 1;
        }
    }

    for (int b = 1; b <= k; b++) {
        for (int j = c_norm[b]; j <= n; j++) {
            if (!dp[j][b][1]) continue;

            bool sf = false;
            if (j == n) sf = (b == k);
            else sf = dp2[n - j][k - b][0];

            if (!sf) continue;

            int l = j - c_norm[b] + 1;
            int r = j;
            d[l]++;
            d[r + 1]--;
        }
    }

    int cur = 0;
    for (int i = 1; i <= n; i++) {
        cur += d[i];
        if (cur) bk[i] = 1;
    }

    string ans(n, '!');
    for (int i = 1; i <= n; i++) {
        if (si[i - 1] != '.') {
            ans[i - 1] = si[i - 1];
            continue;
        }

        if (w[i] && !bk[i]) ans[i - 1] = '_';
        else if (!w[i] && bk[i]) ans[i - 1] = 'X';
        else if (w[i] && bk[i]) ans[i - 1] = '?';
        else ans[i - 1] = 'L';
    }

    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...