Submission #472507

#TimeUsernameProblemLanguageResultExecution timeMemory
472507jalsolJob Scheduling (CEOI12_jobs)C++17
65 / 100
336 ms48148 KiB
// looking to shine brighter in this world...

#define TASK "JOBS"

#ifdef LOCAL
#include "local.h"
#else
#include <bits/stdc++.h>
#define debug(...)
#define DB(...)
#endif

using namespace std;

using ll = long long;
using ld = long double;

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define fi first
#define se second

#define For(i, l, r) for (int i = (l); i <= (r); ++i)
#define Ford(i, r, l) for (int i = (r); i >= (l); --i)
#define Rep(i, n) For (i, 0, (n) - 1)
#define Repd(i, n) Ford (i, (n) - 1, 0)
#define Fe(...) for (auto __VA_ARGS__)

template <class C> inline int isz(const C& c) { return static_cast<int>(c.size()); }
template <class T> inline bool chmin(T& a, const T& b) { return (a > b) ? a = b, true : false; }
template <class T> inline bool chmax(T& a, const T& b) { return (a < b) ? a = b, true : false; }

const bool __initialization = []() {
    cin.tie(nullptr)->sync_with_stdio(false);
    if (fopen(TASK".inp", "r")) {
        (void)(!freopen(TASK".inp", "r", stdin));
        (void)(!freopen(TASK".out", "w", stdout)); }
    cout << setprecision(12) << fixed;
    return true;
}();

constexpr ld eps = 1e-9;
constexpr int inf = 1e9;
constexpr ll linf = 1e18;

// =============================================================================

constexpr int maxn = 1e6 + 5;

struct Job {
    int start, id;

    bool operator<(const Job& o) const {
        return start < o.start;
    }
};

int n, d, m;
Job a[maxn];

int v[maxn];
vector<int> g[maxn];

bool check(int val) {
    memset(v, 0, 4 * (m + 5));
    int ptr = 0;

    For (i, 1, m) {
        chmax(ptr, a[i].start);

        while (v[ptr] == val) ++ptr;
        if (ptr > a[i].start + d) return false;

        ++v[ptr];
    }

    return true;
}
 
signed main() {
    cin >> n >> d >> m;
    For (i, 1, m) {
        cin >> a[i].start;
        a[i].id = i;
    }

    sort(a + 1, a + m + 1);

    int L = 1, R = m;
    int ans = -1;

    while (L <= R) {
        int M = (L + R) / 2;

        if (check(M)) {
            ans = M;
            R = M - 1;
        }
        else {
            L = M + 1;
        }
    }

    cout << ans << '\n';

    int ptr = 0;
    For (i, 1, m) {
        chmax(ptr, a[i].start);

        while (isz(g[ptr]) >= ans) ++ptr;
        if (ptr > a[i].start + d) return 0;

        g[ptr].push_back(a[i].id);
    }

    For (i, 1, n) {
        Fe (x : g[i]) {
            cout << x << ' ';
        }
        cout << 0 << '\n';
    }

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