Submission #1139521

#TimeUsernameProblemLanguageResultExecution timeMemory
1139521gygPaint By Numbers (IOI16_paint)C++20
100 / 100
1014 ms235944 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define arr array 
#define vec vector
#define str string
const int N = 2e5 + 5, K = 1e2 + 5;

int n, k;
arr<int, N> rq;
arr<int, K> sz;

arr<arr<int, N>, 3> sm;
int qry(int x, int l, int r) {
    if (l > r) return 0;
    return sm[x][r] - sm[x][l - 1];
}
arr<int, N> bf, af;
void sm_cmp() {
    for (int i = 1; i <= 2; i++)
        for (int j = 1; j <= n; j++)
            sm[i][j] = sm[i][j - 1] + (rq[j] == i);

    bf[0] = 0;
    for (int i = 1; i <= n; i++) {
        if (rq[i - 1] == 2) bf[i] = i - 1;
        else bf[i] = bf[i - 1];
    }
    af[n + 1] = n + 1;
    for (int i = n; i >= 1; i--) {
        if (rq[i + 1] == 2) af[i] = i + 1;
        else af[i] = af[i + 1];
    }
}

arr<arr<bool, K>, N> lf;
arr<int, N> lf_sm;
void lf_cmp() {
    for (int i = 1; i <= n; i++) {
        int j = i - sz[1] + 1;
        lf[i][1] = (j >= 1 && !qry(1, j, i) && !qry(2, 1, j - 1));
        lf_sm[i] = lf_sm[i - 1] + lf[i][1];
    }

    for (int c = 2; c <= k; c++) {
        for (int i = 1; i <= n; i++) {
            int j = i - sz[c] + 1;
            if (j < 1) continue;
            if (qry(1, j, i)) continue;

            int x = bf[j];
            if (j - 2 < 1) continue;
            lf[i][c] = (x == 0) ? lf_sm[j - 2] : lf_sm[j - 2] - lf_sm[x - 1];
        }

        for (int i = 1; i <= n; i++) lf_sm[i] = lf_sm[i - 1] + lf[i][c];
    }
}

arr<arr<bool, K>, N> rg;
arr<int, N> rg_sm;
void rg_cmp() {
    for (int i = 1; i <= n; i++) {
        int j = i + sz[k] - 1;
        rg[i][k] = (j <= n && !qry(1, i, j) && !qry(2, j + 1, n));
        rg_sm[i] = rg_sm[i - 1] + rg[i][k];
    }

    for (int c = k - 1; c >= 1; c--) {
        for (int i = 1; i <= n; i++) {
            int j = i + sz[c] - 1;
            if (j > n) continue;
            if (qry(1, i, j)) continue;

            int x = af[j];
            if (j + 2 > n) continue;
            rg[i][c] = (x == n + 1) ? rg_sm[n] - rg_sm[j + 1] : rg_sm[x] - rg_sm[j + 1];
        }

        for (int i = 1; i <= n; i++) rg_sm[i] = rg_sm[i - 1] + rg[i][c];
    }
}

arr<bool, N> ps1;
arr<int, N> bg_sm, en_sm, sd_sm;
void ps1_cmp() {
    for (int i = 1; i <= n; i++) {
        bg_sm[i] = bg_sm[i - 1] + (lf[i][k] && !qry(2, i + 1, n));
        en_sm[i] = en_sm[i - 1] + (rg[i][1] && !qry(2, 1, i - 1));
    }

    for (int c = 1; c < k; c++) {
        deque<int> ord;
        for (int j = n; j >= 1; j--) {
            if (j + 2 <= n && rg[j + 2][c + 1]) ord.push_front(j + 2);
            while (ord.size() && ord.back() > af[j]) ord.pop_back();

            if (ord.empty()) continue;
            if (!lf[j][c]) continue;
            sd_sm[j + 1]++;
            sd_sm[ord.back()]--;
        }
    }
    for (int i = 1; i <= n; i++) sd_sm[i] = sd_sm[i] + sd_sm[i - 1];

    for (int id = 1; id <= n; id++) {
        ps1[id] |= (bg_sm[id - 1] - bg_sm[0]);
        ps1[id] |= (en_sm[n] - en_sm[id]);
        ps1[id] |= sd_sm[id];
    }
}

arr<bool, N> ps2;
arr<arr<bool, N>, K> st;
arr<arr<int, N>, K> st_sm;
void ps2_cmp() {
    for (int c = 1; c <= k; c++) {
        for (int i = 1; i <= n; i++) {
            int j = i + sz[c] - 1;
            st[c][i] = (j <= n && rg[i][c] && lf[j][c]); 
            st_sm[c][i] = st_sm[c][i - 1] + st[c][i];
        }
    }

    for (int i = 1; i <= n; i++) {
        for (int c = 1; c <= k; c++) {
            int j = max(i - sz[c] + 1, 1ll);
            ps2[i] |= (st_sm[c][i] - st_sm[c][j - 1]);
        }
    }
}

str solve_puzzle(str _rq, vec<signed> _sz) {
    n = _rq.size(), k = _sz.size();
    for (int i = 1; i <= n; i++) {
        if (_rq[i - 1] == '.') rq[i] = 0;
        if (_rq[i - 1] == '_') rq[i] = 1;
        if (_rq[i - 1] == 'X') rq[i] = 2;
    }
    for (int i = 1; i <= k; i++) sz[i] = _sz[i - 1];

    sm_cmp();
    lf_cmp();
    rg_cmp();

    ps1_cmp();
    ps2_cmp();

    str ans = "";
    for (int i = 1; i <= n; i++) {
        if (!ps1[i]) ans += 'X';
        else if (!ps2[i]) ans += '_';
        else ans += '?';
    }
    return ans;
}
 

Compilation message (stderr)

paint.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
paint_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...