Submission #1070476

#TimeUsernameProblemLanguageResultExecution timeMemory
1070476ZicrusPaint By Numbers (IOI16_paint)C++17
100 / 100
365 ms34388 KiB
#include <bits/stdc++.h>
#include "paint.h"
using namespace std;

typedef long long ll;

ll n, k;
vector<ll> sumW;
vector<vector<bool>> possL, possR;

bool getPossL(int i, int j) {
    if (i < 0) return j == 0;
    return possL[i][j];
}

bool getPossR(int i, int j) {
    if (i >= n) return j == 0;
    return possR[i][j];
}

string solve_puzzle(string s, vector<int> c) {
    n = s.size(), k = c.size();
    sumW = vector<ll>(n+1);
    for (int i = 1; i <= n; i++) sumW[i] = sumW[i-1] + (s[i-1] == '_');
    possL = vector<vector<bool>>(n, vector<bool>(k+1));
    possR = vector<vector<bool>>(n, vector<bool>(k+1));
    possL[0][0] = s[0] != 'X';
    for (int i = 1; i < n; i++) {
        possL[i][0] = possL[i-1][0] && s[i] != 'X';
    }
    for (int i = 0; i < n; i++) {
        for (int j = 1; j <= k; j++) {
            possL[i][j] = s[i] != 'X' && getPossL(i-1, j);
            if (i+1-c[j-1] < 0) continue;
            possL[i][j] = possL[i][j] || ((sumW[i+1] - sumW[i+1-c[j-1]] == 0) && (i-c[j-1] < 0 || s[i-c[j-1]] != 'X') && getPossL(i-1-c[j-1], j-1));
        }
    }
    possR[n-1][0] = s[n-1] != 'X';
    for (int i = n-2; i >= 0; i--) {
        possR[i][0] = possR[i+1][0] && s[i] != 'X';
    }
    for (int i = n-1; i >= 0; i--) {
        for (int j = 1; j <= k; j++) {
            possR[i][j] = s[i] != 'X' && getPossR(i+1, j);
            if (i-1+c[k-j] >= n) continue;
            possR[i][j] = possR[i][j] || ((sumW[i+c[k-j]] - sumW[i] == 0) && (i+c[k-j] >= n || s[i+c[k-j]] != 'X') && getPossR(i+1+c[k-j], j-1));
        }
    }

    vector<ll> resB(n+1), resW(n+1);
    for (int j = 0; j < k; j++) {
        for (int i = 0; i+c[j] < n+1; i++) {
            if (sumW[i+c[j]] - sumW[i] != 0) continue;
            if (i-1 >= 0 && s[i-1] == 'X') continue;
            if (i+c[j] < n && s[i+c[j]] == 'X') continue;
            if (!getPossL(i-2, j) || !getPossR(i+1+c[j], k-j-1)) continue;
            resB[i]++; resB[i+c[j]]--;
        }
    }
    for (int i = 1; i < n; i++) resB[i] += resB[i-1];
    for (int j = 0; j <= k; j++) {
        for (int i = 0; i < n; i++) {
            if (s[i] == 'X') continue;
            if (!getPossL(i-1, j) || !getPossR(i+1, k-j)) continue;
            resW[i] = 1;
        }
    }

    string res;
    for (int i = 0; i < n; i++) {
        if (resB[i] > 0 && resW[i] > 0) res.push_back('?');
        else if (resB[i] > 0) res.push_back('X');
        else if (resW[i] > 0) res.push_back('_');
    }
    return res;
}
#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...