Submission #1352340

#TimeUsernameProblemLanguageResultExecution timeMemory
1352340po_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);

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

        // remove old
        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;
        }
    }

    // greedy covering
    int ans = 0;
    int i = 0;

    while (i < N) {
        int best = -1;

        // try all possible starts that can cover i
        for (int j = max(0, i - M + 1); j <= i && j + M <= N; j++) {
            if (good[j]) {
                best = max(best, j + M);
            }
        }

        if (best == -1) return -1;

        ans++;
        i = best;
    }

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