제출 #93995

#제출 시각아이디문제언어결과실행 시간메모리
93995rkocharyanJob Scheduling (CEOI12_jobs)C++14
100 / 100
162 ms13304 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 7;

int n, d, m;
int f[N];
vector <int> g[N];

bool check(int t) {
    deque < pair <int, int> > h;
    for(int i = 1; i <= n; i++) {
        if(f[i]) h.emplace_back(i, f[i]);
        int cur_t = t;
        while(!h.empty() && cur_t) {
            if(i - h[0].first > d) return false;
            int next_t = cur_t;
            next_t -= min(h[0].second, cur_t);
            h[0].second -= min(h[0].second, cur_t);
            cur_t = next_t;
            if(h[0].second == 0) {
                h.pop_front();
            }
        }
    }
    if(h.size()) return false;
    return true;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> d >> m;
    for(int i = 0; i < m; i++) {
        int x;
        cin >> x;
        f[x]++;
        g[x].push_back(i + 1);
    }
    int low = 1, high = m, best = m;
    while(low <= high) {
        int mid = (low + high) >> 1;
        if(check(mid)) {
            best = mid;
            high = mid - 1;
        } else {
            low = mid + 1;
        }
    }
    cout << best << '\n';
    deque < pair <int, int> > h;
    for(int i = 1; i <= n; i++) {
        if(f[i]) h.emplace_back(i, f[i]);
        int cur_t = best;
        while(!h.empty() && cur_t) {
            int next_t = cur_t;
            for(int j = 0; j < min(h[0].second, cur_t); j++) {
                cout << g[h[0].first].back() << ' ';
                g[h[0].first].pop_back();
            }
            next_t -= min(h[0].second, cur_t);
            h[0].second -= min(h[0].second, cur_t);
            cur_t = next_t;
            if(h[0].second == 0) {
                h.pop_front();
            }
        }
        cout << "0\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...