Submission #1116005

#TimeUsernameProblemLanguageResultExecution timeMemory
1116005adaawfPainting Walls (APIO20_paint)C++17
100 / 100
138 ms18256 KiB
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int f[100005], g[100005], dd[100005], d[100005];
vector<int> bb[100005];
int minimumInstructions(int n, int m, int k, vector<int> c, vector<int> a, vector<vector<int>> b) {
    for (int i = 0; i <= k; i++) bb[i].clear();
    for (int i = 0; i < m; i++) {
        for (int w : b[i]) {
            bb[w].push_back(i);
        }
    }
    for (int i = 0; i < n; i++) {
        f[i] = dd[i] = 0;
        for (int w : bb[c[i]]) {
            int h = i - w;
            if (h < 0) continue;
            if (f[h] == w) {
                f[h]++;
            }
        }
    }
    for (int i = n - 1; i >= 0; i--) {
        g[i] = 0;
        for (int w : bb[c[i]]) {
            int h = i + m - w - 1;
            if (h >= n) continue;
            if (g[h] == m - w - 1) {
                g[h]++;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int w : bb[c[i]]) {
            int h = i - w;
            if (h < 0) continue;
            if (f[h] >= w + 1) {
                if (w == m - 1 || (h != 0 && g[h - 1] >= m - w - 1)) {
                    dd[i] = 1;
                    break;
                }
            }
        }
    }
    set<pair<int, int>> s;
    s.insert({0, -1});
    for (int i = 0; i < n; i++) {
        d[i] = 1e9;
        if (dd[i] == 1) {
            d[i] = (*s.begin()).first + 1;
        }
        if (i >= m - 1) {
            if (i == m - 1) s.erase({0, -1});
            else s.erase({d[i - m], i - m});
        }
        s.insert({d[i], i});
    }
    if (d[n - 1] >= 1e8) return -1;
    return d[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...