제출 #1161779

#제출 시각아이디문제언어결과실행 시간메모리
1161779The_SamuraiPainting Walls (APIO20_paint)C++20
51 / 100
574 ms589824 KiB
#include "paint.h"
#include "bits/stdc++.h"
using namespace std;

int minimumInstructions(int n, int m, int k, vector<int> c, vector<int> ln, vector<vector<int>> g) {
    vector likes(m, vector(k, false));
    for (int i = 0; i < m; i++) {
        for (int x: g[i]) likes[i][x] = true;
    }
    vector<int> cnt(n);
    for (int y = 0; y <= n - m; y++) {
        
        for (int x = 0; x < m; x++) {
            bool ok = true;
            for (int i = 0; i < m and ok; i++) {
                ok &= likes[(x + i) % m][c[y + i]];
            }
            if (ok) {
                cnt[y] = m;
                break;
            }
        }
    }
    // for (int j = 0; j < m; j++) {
    //     vector<int> pref(n);
    //     for (int i = 0; i < n; i++) {
    //         if (!likes[j][c[i]]) continue;
    //         int l = max(0, i - m + 1);
    //         int r = min(i, n - m);
    //         // cout << i << ' ' << j << ' ' << l << ' ' << r << endl;
    //         pref[l]++;
    //         if (r + 1 < n) pref[r + 1]--;
    //     }
    //     for (int i = 1; i < n; i++) pref[i] += pref[i - 1];
    //     for (int i = 0; i < n; i++) {
    //         if (pref[i]) cnt[i]++;
    //     }
    // }
    set<int, greater<>> st; st.insert(-m);
    for (int i = 0; i <= n - m; i++) {
        if (cnt[i] == m) st.insert(i);
    }
    int now = -m, ans = 0;
    while (now < n - m) {
        auto it = st.lower_bound(now + m);
        if (*it == now) return -1;
        now = *it;
        ans++;
    }

    return ans;
}
#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...