제출 #1348549

#제출 시각아이디문제언어결과실행 시간메모리
1348549kawhietPaint By Numbers (IOI16_paint)C++20
7 / 100
0 ms344 KiB
#include <bits/stdc++.h>
#include "paint.h"
using namespace std;

array<vector<vector<int>>, 2> get(string s, vector<int> c) {
    int n = s.size();
    int k = c.size();
    s = " " + s;
    ranges::reverse(c); c.push_back(0); ranges::reverse(c);
    vector<vector<int>> w(n + 1, vector<int>(k + 1));
    vector<vector<int>> b(n + 1, vector<int>(k + 1));
    for (int i = 0; i <= n; i++) {
        if (s[i] != 'X') {
            w[i][0] = 1;
        }
    }
    b[0][0] = 1;
    vector<int> p(n + 1);
    for (int i = 1; i <= n; i++) {
        p[i] = p[i - 1] + (s[i] == '_');
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++) {
            if (b[i - 1][j] && s[i] != 'X') {
                w[i][j] = 1;
            }
            if (w[i - 1][j] && s[i] != 'X') {
                w[i][j] = 1;
            }
            if (i - c[j] >= 0 && p[i] - p[i - c[j]] == 0 && w[i - c[j]][j - 1]) {
                b[i][j] = 1;
            }
        }
    }
    return {w, b};
}

string solve_puzzle(string s, vector<int> c) {
    int n = s.size();
    int k = c.size();
    auto [w1, b1] = get(s, c);
    ranges::reverse(s);
    ranges::reverse(c);
    auto [w2, b2] = get(s, c);
    reverse(w2.begin() + 1, w2.end());
    reverse(b2.begin() + 1, b2.end());
    vector<bool> black(n + 1), white(n + 1);
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= k; j++) {
            if (w1[i][j] && w2[i][k - j]) {
                white[i] = 1;
            }
            if (j == 0 && b2[i][k]) {
                for (int x = i; x < i + c[0]; x++) {
                    black[x] = 1;
                }
            }
            if (j == k && b1[i][k]) {
                for (int x = i; x > i - c[j - 1]; x--) {
                    assert(x >= 0);
                    black[x] = 1;
                }
            }
            if (j == 0 || j == k) continue;
            for (int t = i + 2; t <= n; t++) {
                if (b1[i][j] && b2[t][k - j]) {
                    for (int x = i; x > i - c[j - 1]; x--) {
                        assert(x >= 0);
                        black[x] = 1;
                    }
                }
            }
            for (int t = i - 2; t >= 0; t--) {
                if (b1[t][j] && b2[i][k - j]) {
                    for (int x = i; x < i + c[j - 1]; x++) {
                        assert(x <= n);
                        black[x] = 1;
                    }
                }
            }
        }
    }
    string ans(n, ' ');
    string str = " X_?";
    for (int i = 1; i <= n; i++) {
        int j = 0;
        if (black[i]) j += 1;
        if (white[i]) j += 2;
        ans[i - 1] = str[j];
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...