Submission #1354694

#TimeUsernameProblemLanguageResultExecution timeMemory
1354694semiautoPaint By Numbers (IOI16_paint)C++20
Compilation error
0 ms0 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;
}


Compilation message (stderr)

paint.cpp: In function 'std::vector<std::vector<bool> > calc_dp(std::string, std::vector<int>)':
paint.cpp:5:13: error: 'blocks' was not declared in this scope; did you mean 'lockf'?
    5 |     int k = blocks.size();
      |             ^~~~~~
      |             lockf