Submission #1122510

#TimeUsernameProblemLanguageResultExecution timeMemory
1122510andrewkong972Job Scheduling (CEOI12_jobs)C++17
50 / 100
440 ms13944 KiB
  #include <bits/stdc++.h>
using namespace std;

const int SIZE = 1e5 + 5;
int n,d,m; 
vector<pair<int,int>> vec;
int jobs[SIZE];
queue<pair<int,int>> q;

bool solve(int k) {
    int av = k;
    
    for (int i=1; i<=n; i++) {
        av = k;
        if (jobs[i] > 0) q.push(make_pair(jobs[i], i+d));

        while (av > 0 && !q.empty()) {
            if (q.front().second < i) return 0;
            else {
                if (av >= q.front().first) {
                    av -= q.front().first;
                    q.pop();
                }
                else q.front().first -= av, av = 0;
            }
        }
    }

    return 1;
}

bool comp(pair<int,int> a, pair<int,int> b) {
    return (a.first != b.first ? a.first < b.first : a.second < b.second);
}

void print(int ans) {
    sort(vec.begin(), vec.end(), comp);
    int left = ans, index = 0;

    for (int i=1; i<=n; i++) {
        left = ans;        
        while (index < m && vec[index].first <= i && left > 0) {
            cout << vec[index].second << " ";
            left --, index ++ ;
        }
        cout << 0 << endl;
    }

    return;
}

int main() {
    int cur;
    cin >> n >> d >> m;
    
    for (int i=0; i<m; i++) {
        cin >> cur;
        vec.push_back(make_pair(cur, i+1));
        jobs[cur] ++;
    }

    int lp = 1, rp = m;

    while (lp < rp) {
        int mid = lp + (rp - lp)/2;
        if (solve(mid)) rp = mid;
        else lp = mid + 1;
    }

    cout << lp << endl;

    print(lp);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...