제출 #1359195

#제출 시각아이디문제언어결과실행 시간메모리
1359195kantaponz벽 칠하기 (APIO20_paint)C++20
100 / 100
181 ms13108 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int nx = 100005;
int dp[nx], mn[nx];
vector<pair<int,int>> pv;
vector<int> g[nx];

int minimumInstructions(int N, int M, int K, vector<int> C, vector<int> A, vector<vector<int>> B) {
    for (int i = 0; i < N; i++) mn[i] = 1e9;
    for (int i = 0; i < M; i++) for (auto x : B[i]) g[x].emplace_back(i);
    for (int i = 0; i < M; i++) dp[i] = 1e9;
    for (int i = 0; i < N; i++) {
        vector<pair<int,int>> nw;
        for (auto idx : g[C[i]]) {
            if (dp[(idx-1+M)%M] == 1e9) {
                nw.emplace_back(idx, i);
                mn[i] = min(mn[i], i);
            } else {
                nw.emplace_back(idx, dp[(idx-1+M)%M]);
                mn[i] = min(mn[i], dp[(idx-1+M)%M]);
            }
        }
        for (auto [idx, x] : pv) dp[idx] = 1e9;
        for (auto [idx, x] : nw) dp[idx] = x;
        pv = nw;
    }

    int l = M - 1, r = M - 1, ans = 0;
    while (l < N) {
        for (int i = r; i >= l; i--) {
            if (mn[i] <= i - M + 1) {
                l = i + 1, r = i + M;
                ans++;
                break;
            }
            if (i == l) return -1;
        }
    }

    return ans;

}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…