제출 #557744

#제출 시각아이디문제언어결과실행 시간메모리
557744InternetPerson10벽 칠하기 (APIO20_paint)C++17
100 / 100
1138 ms17180 KiB
#include "paint.h"
#include <bits/stdc++.h>

using namespace std;

int BIG = 999999;

int minimumInstructions(
    int N, int M, int K, vector<int> C,
    vector<int> A, vector<vector<int>> B) {
    vector<vector<int>> conts(K);
    vector<int> contCount(M);
    vector<int> valid(N);
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < A[i]; j++) {
            conts[B[i][j]].push_back(i);
        }
    }
    int goodConts = 0;
    for(int i = 0; i < N; i++) {
        if(i >= M) {
            for(int g : conts[C[i-M]]) {
                int x = (g + N - (i - M)) % M;
                if(contCount[x] == M) {
                    goodConts--;
                }
                contCount[x]--;
            }
        }
        for(int g : conts[C[i]]) {
            int x = (g + N - i) % M;
            contCount[x]++;
            if(contCount[x] == M) {
                goodConts++;
            }
        }
        if(goodConts) valid[i]++;
    }
    if(!valid[M-1]) return -1;
    multiset<int> s;
    s.insert(1);
    for(int i = M; i < N; i++) {
        if(!valid[i]) {
            valid[i] = BIG;
            s.insert(BIG);
        }
        else {
            valid[i] = *(s.begin()) + 1;
            s.insert(valid[i]);
        }
        if(i >= 2 * M - 1) {
            auto it = s.find(valid[i-M]);
            s.erase(it);
        }
    }
    if(valid[N-1] >= BIG) return -1;
    return valid[N-1];
}
#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...