제출 #1360454

#제출 시각아이디문제언어결과실행 시간메모리
1360454xorshift벽 칠하기 (APIO20_paint)C++20
0 / 100
0 ms360 KiB
#include <bits/stdc++.h>
using namespace std;
using vint = vector<int>;
using ll = long long;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using pill = pair<int, ll>;
using vpill = vector<pill>;
using plli = pair<ll, int>;
using vplli = vector<plli>;
#define fi first
#define se second
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for(int i = (n)-1; i >= 0; --i)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a)-1; i >= (b); --i)

int minimumInstructions(int N, int M, int K, vint C, vint A, vector<vint> B) {
    vector<vint> f(K);
    rep(i, M) rep(j, A[i]) f[B[i][j]].push_back(i);
    
    vpint vd_rl; vd_rl.reserve(N);
    set<int> prff, nprff;
    rrep(i, N) {
        nprff.clear(); prff.insert(i);
        for (auto& v: f[C[i]]) {
            if (prff.contains(i+M-1-v)) nprff.insert(i+M-1-v);
        }
        swap(prff, nprff);
        for (auto& v: nprff) if (!prff.count(v) && i < v)
            vd_rl.push_back({i+1, v});
    }
    for (auto& v: prff) vd_rl.push_back({0, v});
    
    vint idx; idx.reserve(N);
    set<int> suff, nsuff;
    int prff_i = sz(vd_rl)-1;
    rep(i, N) {
        nsuff.clear(); suff.insert(i);
        for (auto& v: f[C[i]]) {
            if (suff.contains(i-v)) nsuff.insert(i-v);
        }
        swap(suff, nsuff);
        while (prff_i >= 0 && vd_rl[prff_i].fi <= i-M) {
            prff.insert(vd_rl[prff_i].se); prff_i--;
        }
        if (i >= M-1) {
            for (auto& v: suff) {
                if (v == i-M+1 || prff.count(v-1)) {idx.push_back(i-M+1); break;}
            }
            if (prff.count(i)) if (sz(idx) == 0 || idx[sz(idx)-1] != i-M) idx.push_back(i-M+1);
            prff.erase(i-M+1);
        }
    }
    if (sz(idx) == 0) return -1;
    int res = 0;
    int cv = 0;
    for(int i = 0; i < sz(idx);) {
        int j = i;
        while (j+1 < sz(idx) && idx[j+1] <= cv) j++;
        if (idx[j] > cv) return -1;
        cv = idx[j]+M-1;
        i = j+1;
        res++;
    }
    if (cv < N-1) return -1;
    return res;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…