제출 #850052

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

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = (int)1e5 + 7;
bool isok[N], act[N], ok[N];
int best[N];
vector<int> a, c;
vector<vector<int>> b;
int n, m, k;

int minimumInstructions(int N, int M, int K, vector<int> C, vector<int> A, 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);
        for (int i = 0; i < m; i++) {
                assert((int)b[i].size() == a[i]);
        }

        
        for (int w = 0; w < m; w++) {
                for (auto& col : b[w]) {
                        act[col] = 1;
                }
                for (int i = 0; i < n; i++) {
                        if (act[c[i]]) {
                                isok[i * m + w] = 1;
                        }
                }
                for (auto& col : b[w]) {
                        act[col] = 0;
                }
        }

        for (int i = n - 1; i >= 0; i--) {
                for (int w = 0; w < m; w++) {
                        if (isok[i * m + w]) {
                                best[i * m + w] = 1;
                                if (i + 1 < n) {
                                        best[i * m + w] += best[(i + 1) * m + (w + 1) % m];
                                }
                        }
                }
        }
        for (int y = 0; y + m - 1 < n; y++) {
                for (int w = 0; w < m; w++) {
                        if (best[y * m + w] >= m) {
                                ok[y] = 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...