Submission #1021784

#TimeUsernameProblemLanguageResultExecution timeMemory
1021784vjudge1Paint By Numbers (IOI16_paint)C++17
80 / 100
2063 ms137044 KiB
#include "paint.h"
#include <bits/stdc++.h>

using namespace std;

#define rall(s) s.rbegin(), s.rend()
#define all(s) s.begin(), s.end()
#define sz(s) (int)s.size()
#define s second 
#define f first   

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int can(string &s, vector<int> &c) {
    int n = sz(s), m = sz(c);
    bool dp[n + 2][m + 1][n + 1];
    memset(dp, 0, sizeof(dp));
    dp[0][0][0] = 1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= m; j++) {
            if (j == m) {
                if (dp[i][j][0] && s[i] != 'X') dp[i + 1][j][0] = 1;
                continue;
            }
            for (int k = 0; k <= c[j]; k++) {
                //cout << dp[i][j][k] << ' ';
                if (!dp[i][j][k]) continue;
                if (k) {
                    if (k == c[j]) {
                        if (s[i] != 'X') dp[i + 1][j + 1][0] = 1;
                        continue;
                    }
                    if (s[i] != '_') dp[i + 1][j][k + 1] = 1;
                    continue;
                }
                if (s[i] != '_') dp[i + 1][j][1] = 1;
                if (s[i] != 'X') dp[i + 1][j][0] = 1;
            }
            //cout << endl;
        }
        //cout << endl << endl;
    }
    return (dp[n][m][0] || dp[n][m - 1][c[m - 1]]);
}

string solve_puzzle(string s, vector<int> c) {
    string ans = "";
    int n = sz(s);
    for (int i = 0; i < n; i++) {
        if (s[i] != '.') {
            ans += s[i];
            continue;
        }
        s[i] = '_';
        int x = can(s, c);
        s[i] = 'X';
        int y = can(s, c);
        //cout << i << ' ' << x << ' ' << y << endl;
        if (x && y) ans += '?';
        else if (x) ans += '_';
        else ans += 'X';
        s[i] = '.';
    }
    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...