Submission #143470

#TimeUsernameProblemLanguageResultExecution timeMemory
143470dolphingarlicJob Scheduling (IOI19_job)C++14
100 / 100
262 ms27564 KiB
#include "job.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int mxN = 2e5;
int n, nxt[mxN], ta[mxN];
vector<int> o;
ll u2[mxN], d2[mxN];

struct cmp {
    bool operator()(const int &a, const int &b) {
        return d2[a] * u2[b] > d2[b] * u2[a];
    }
};
priority_queue<int, vector<int>, cmp> c[mxN];

void dfs(int u) {
    o.push_back(u);
    for (; c[u].size(); c[u].pop())
        dfs(c[u].top());
}

ll scheduling_cost(vector<int> p, vector<int> u, vector<int> d) {
    n = p.size();
    memset(nxt, -1, 4 * n);
    iota(ta, ta + n, 0);
    for (int i = n - 1; ~i; --i) {
        u2[i] = u[i];
        d2[i] = d[i];
        while (c[i].size()) {
            int u = c[i].top();
            if (cmp()(u, i))
                break;
            c[i].pop();
            nxt[ta[i]] = u;
            ta[i] = ta[u];
            u2[i] += u2[u];
            d2[i] += d2[u];
            if (c[i].size() < c[u].size())
                swap(c[i], c[u]);
            for (; c[u].size(); c[u].pop())
                c[i].push(c[u].top());
        }
        if (i)
            c[p[i]].push(i);
    }
    dfs(0);
    sort(o.begin(), o.end(), cmp());
    ll t = 0, ans = 0;
    for (int i = o.size() - 1; ~i; --i) {
        for (int j = o[i]; ~j; j = nxt[j]) {
            t += d[j];
            ans += t * u[j];
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...