Submission #1352344

#TimeUsernameProblemLanguageResultExecution timeMemory
1352344po_rag526Painting Walls (APIO20_paint)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;

int minimumInstructions(
    int N, int M, int K,
    vector<int> C,
    vector<int> A,
    vector<vector<int>> B
) {
    vector<vector<int>> like(K);
    for (int j = 0; j < M; j++) {
        for (int c : B[j]) {
            like[c].push_back(j);
        }
    }

    vector<int> cnt(M, 0);
    int active = 0;
    vector<int> good(N, 0);

    // find valid starts
    for (int i = 0; i < N; i++) {
        for (int j : like[C[i]]) {
            int r = (j - i) % M;
            if (r < 0) r += M;
            if (cnt[r] == 0) active++;
            cnt[r]++;
        }

        if (i >= M) {
            for (int j : like[C[i - M]]) {
                int r = (j - (i - M)) % M;
                if (r < 0) r += M;
                cnt[r]--;
                if (cnt[r] == 0) active--;
            }
        }

        if (i >= M - 1 && active == M) {
            good[i - M + 1] = 1;
        }
    }

    // nxt[i] = farthest we can reach starting from i
    vector<int> nxt(N, -1);

    int best = -1;
    for (int i = 0; i < N; i++) {
        if (good[i]) best = max(best, i + M);
        nxt[i] = best;
    }

    // greedy jump (like minimum intervals cover)
    int ans = 0;
    int i = 0;

    while (i < N) {
        if (nxt[i] <= i) return -1;

        int far = nxt[i];

        // extend using all starts inside [i, far)
        int new_far = far;
        for (int j = i; j < far; j++) {
            new_far = max(new_far, nxt[j]);
        }

        ans++;
        i = new_far;
    }

    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...