제출 #1318349

#제출 시각아이디문제언어결과실행 시간메모리
1318349theoneandonlytronJob Scheduling (CEOI12_jobs)C++20
0 / 100
1099 ms91368 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
int n,d,m;
vector <pair<ll,ll>> l1;
bool check(ll a, vector <ll> f_table){
    ll answ = 0;
    for (int i =1 ; i <= (n-d); i++){
        if (f_table[i] < a){
            answ -= min(answ, a - f_table[i]);
        }
        else{
            answ += f_table[i] - a;
        }
    }
    if (answ >= 1){
        return false;
    }
    else{
        return true;
    }
}

int main(){
    cin >> n >> d >> m;
    vector <ll> f_table(n+1,0);
    vector <deque <ll>> final(n+1);
    for (int i = 0; i < m; i++){
        ll a;
        cin >> a;
        l1.push_back({a, i+1});
        f_table[a] += 1;
        final[a].push_back(i+1);
    }
    sort(l1.begin(), l1.end());
    ll l = 1;
    ll r = m;
    while (l!=r){
        ll mid_point = (l+r)/2;
        if (check(mid_point, f_table)){
            r = mid_point;
        }
        else{
            l = mid_point + 1;
        }
    }
    vector <ll> counter(n+1, 0);
    queue <ll> idk;
    for (int i = 1; i <= n - d; i++){
        if (final[i].size() > l){
            while (final[i].size() > l){
                ll current = final[i].back();
                final[i].pop_back();
                idk.push(current);
            }
        }
        else{
            for (int j = 0; j < idk.size(); j++){
                ll current = idk.front();
                idk.pop();
                final[i].push_front(current);
                if (final[i].size() > l){
                    ll now = final[i].back();
                    final[i].pop_back();
                    idk.push(now);
                }
            }
        }
    }
    cout << l << "\n";
    for (int i = 1; i <= n; i++){
        for (auto &p : final[i]){
            cout << p << " ";
        }
        cout << 0 << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...