제출 #850135

#제출 시각아이디문제언어결과실행 시간메모리
850135tvladm2009벽 칠하기 (APIO20_paint)C++17
100 / 100
646 ms18264 KiB
#include "paint.h"

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n, m, k;

int minimumInstructions(int N, int M, int K, vector<int> C, vector<int> A, vector<vector<int>> B) {
        vector<int> a, c;
        vector<vector<int>> b;

        n = N;
        m = M;
        k = K;
        c = C;
        a = A;
        b = B;
        assert((int)c.size() == n);
        assert((int)a.size() == m);
        assert((int)b.size() == m);
        vector<vector<int>> who(k);
        vector<int> cnt(m, 0);
        for (int i = 0; i < m; i++) {
                assert((int)b[i].size() == a[i]);
                for (auto& it : b[i]) {
                        who[it].push_back(i);
                }
        }


        int cm = 0;
        for (int i = 0; i < m; i++) {
                for (auto &it : who[c[i]]) {
                        int z = (i + m - it) % m;
                        cm -= (cnt[z] == m);
                        cnt[z]++;
                        cm += (cnt[z] == m);
                }
        }
        vector<bool> ok(n, 0);
        ok[0] = (cm >= 1);
        for (int i = 1; i <= n - m; i++) {
                int j = i + m - 1;
                assert(j < n);

                {
                        for (auto &it : who[c[j]]) {
                                int z = (j + m - it) % m;
                                cm -= (cnt[z] == m);
                                cnt[z]++;
                                cm += (cnt[z] == m);
                        }
                }
                {
                        for (auto &it : who[c[i - 1]]) {
                                int z = (i - 1 + m - it) % m;
                                cm -= (cnt[z] == m);
                                cnt[z]--;
                                cm += (cnt[z] == m);
                        }
                }
                ok[i] = (cm >= 1);
        }

        vector<int> inds;
        for (int i = 0; i < n; i++) {
                if (ok[i]) {
                        inds.push_back(i);
                }
        }
        if (inds.empty()) {
                return -1;
        }
        assert((int) inds.size() >= 1);
        if (inds[0] != 0 || inds.back() != n - m) {
                return -1;
        }
        int l = 0, cost = 0;
        while (1) {
                int r = l;
                cost++;
                while (r + 1 < (int) inds.size() && inds[r + 1] <= inds[l] + m) {
                        r++;
                }
                if (r == (int) inds.size() - 1) {
                        if (l < r) {
                                cost++;
                        }
                        break;
                }
                if (l == r) {
                        return -1;
                }
                l = r;
        }
        return cost;
}
#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...