Submission #1352341

#TimeUsernameProblemLanguageResultExecution timeMemory
1352341vjudge1Painting 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++) {
        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;
        }
    }

    // DP with prefix minimum
    const int INF = 1e9;
    vector<int> dp(N + 1, INF);
    dp[0] = 0;

    // next reachable max
    int r = 0;

    for (int i = 0; i < N; i++) {
        if (dp[i] == INF) continue;

      
        while (r < N && good[r] && r <= i) {
            r++;
        }

        for (int j = i; j < N && j <= i + M - 1; j++) {
            if (good[j]) {
                int to = j + M;
                dp[to] = min(dp[to], dp[i] + 1);
            }
        }
    }

    return (dp[N] == INF ? -1 : dp[N]);
}
#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...