Submission #848039

#TimeUsernameProblemLanguageResultExecution timeMemory
848039daodaJob Scheduling (CEOI12_jobs)C++17
100 / 100
204 ms21328 KiB
#include <bits/stdc++.h>

using namespace std;
#define FOR(a, b) for(ll i = a; i < b; i++)
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL);

typedef long long int ll;
typedef pair<ll, ll> pll; // comments that are mixed
typedef vector<ll> vll; // in with code are placed
typedef vector<pll> vpll; // on the right side
typedef vector<bool> vb;
typedef vector<char> vc;

ll n,d,m;
vector<vll> requests;

bool f(ll machines) {
    ll cur_day=1, mach_used=0;
    
    FOR(1, n + 1) {
        if(i > cur_day) {
            cur_day=i;
            mach_used=0;
        }
        if(!requests[i].size()) continue;
        ll amt_days=ceil(requests[i].size() * 1.0f / machines) - 1;
        mach_used += requests[i].size() - amt_days * machines;
        if(mach_used > machines) {
            mach_used -= machines;
            amt_days++;
        }
        cur_day += amt_days;
        // cout << i << ": "<< cur_day << " " << mach_used << endl;
        if(cur_day - i > d || cur_day > n) return false;
        
    }
    return true;
}

int main() {
    fast

    cin >> n >> d >> m;
    requests.resize(n + 1);
    FOR(1, m+1) {
        ll req;
        cin >> req;
        requests[req].push_back(i);
    }
    ll lb=1, upb=m;
    
    while(lb < upb) {
        ll mid=(upb + lb)/2;
        // cout << "mid :" << mid << endl;
        if(f(mid)) upb=mid;
        else lb=mid+1;
    }
    cout << upb << endl;
    
    ll left=upb, cur_day=1;
    
    FOR(1, n+1) {
        while(i > cur_day) {
            left=upb;
            cur_day++;
            cout << 0 << endl;
            // cout << 1 << " " << cur_day << endl;
        }
        for(auto x : requests[i]) {
            cout << x << " ";
            left--;
            if(!left) {
                cur_day++;
                left=upb;
                cout << 0 << endl;
                // cout << "2" << " " << cur_day<< endl;
            }
        }
    }
    while(cur_day <= n) {
        cout << 0 << endl;
        cur_day++;
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...