제출 #207116

#제출 시각아이디문제언어결과실행 시간메모리
207116zvonimir11Job Scheduling (CEOI12_jobs)C++17
0 / 100
50 ms65540 KiB
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

int n, m, d, a[1000005], b[1000005];
queue<int> dn[1000005];

bool f(int x) {
    queue<int> p;
    for(int i = 1; i <= n; ++i) {
        int o = x;
        while(!p.empty() && o > 0) {
            if(i - p.front() > d)
                return 0;
            --o;
            p.pop();
        }
        for(int j = 0; j < b[i]; ++j) {
            if(o > 0) {
                --o;
                continue;
            }
            p.push(i);
        }
    }
    if(p.size() > 0)
        return 0;
    return 1;
}

int main() {
    cin >> n >> d >> m;
    for(int i = 0; i < m; ++i)
        cin >> a[i], ++b[a[i]], dn[a[i]].push(i + 1);
    f(1);

    int lo = 1, hi = 1000005;
    while(lo < hi) {
        int md = (hi + lo) / 2;
        if(f(md))
            hi = md;
        else
            lo = md + 1;
    }
    int x = lo;

    cout << lo << endl;

    queue<int> p;
    for(int i = 1; i <= n; ++i) {
        int o = x;
        while(!p.empty() && o > 0) {
            --o;
            cout << dn[p.front()].front() << " ", dn[p.front()].pop();
            p.pop();
        }
        for(int j = 0; j < b[i]; ++j) {
            if(o > 0) {
                --o;
                cout << dn[i].front() << " ", dn[i].pop();
                continue;
            }
            p.push(i);
        }
        cout << "0 \n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...