제출 #1317961

#제출 시각아이디문제언어결과실행 시간메모리
1317961woolytankJob Scheduling (CEOI12_jobs)C++20
85 / 100
188 ms78100 KiB
#include <bits/stdc++.h>

using namespace std;

bool ifPossible(vector<int>& jobs, int& x, int& d) {
    deque<pair<int,int>> dq;
    for(int i = 0; i < jobs.size(); i++) {
        if(!dq.empty() && dq.front().first + d < i) return 0;
        int machines = x;
        while(!dq.empty() && machines) {
            if(dq.front().second > machines) {
                dq.front().second -= machines;
                machines = 0;
            }
            else {
                machines -= dq.front().second;
                dq.pop_front();
            }
        }
        if(jobs[i] > machines) dq.push_back({i, jobs[i] - machines});
    }
    return 1;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, m, d;
    cin >> n >> d >> m;
    vector<int> jobs(n);
    vector<deque<int>> ids(n);
    for(int i = 0; i < m; i++) {
        int x;
        cin >> x;
        x--;
        jobs[x]++;
        ids[x].push_back(i + 1);
    }
    int L = 0,R = m;
    while(R - L > 1) {
        int mid = (L + R) / 2;
        if(ifPossible(jobs, mid, d)) R = mid;
        else L = mid;
    }
    cout << R << endl;
    deque<pair<int,int>> dq;
    vector<int> output;

    for(int i = 0; i < jobs.size(); i++) {
        int machines = R;
        while(!dq.empty() && machines) {
            if(dq.front().second > machines) {
                dq.front().second -= machines;
                auto& ls = ids[dq.front().first];
                while(machines) {
                    output.push_back(ls.front());
                    ls.pop_front();
                    machines--;
                }
            }
            else {
                auto& ls = ids[dq.front().first];
                while(dq.front().second) {
                    output.push_back(ls.front());
                    ls.pop_front();
                    machines--;
                    dq.front().second--;
                }
                dq.pop_front();
            }
        }
        if(jobs[i] > machines) {
            dq.push_back({i, jobs[i] - machines});
            auto& ls = ids[i];
            while(machines) {
                output.push_back(ls.front());
                ls.pop_front();
                machines--;
            }
        }
        else {
            auto& ls = ids[i];
            while(!ls.empty()) {
                output.push_back(ls.front());
                ls.pop_front();
                machines--;
            }
        }
        for(int x : output) cout << x << " ";
        cout << 0 << endl;
        output.clear();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...