Submission #1357417

#TimeUsernameProblemLanguageResultExecution timeMemory
1357417toast12Job Scheduling (IOI19_job)C++20
58 / 100
3096 ms38068 KiB
#include "job.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

struct DSU {
    vector<ll> link, sz;
    vector<ll> u, d;
    vector<vector<int>> seq;
    DSU(int n, vector<int> &U, vector<int> &D) {
        sz.resize(n, 1);
        link.resize(n);
        iota(link.begin(), link.end(), 0);
        seq.resize(n);
        for (int i = 0; i < n; i++) seq[i].push_back(i);
        u.resize(n);
        d.resize(n);
        for (int i = 0; i < n; i++) {
            u[i] = U[i];
            d[i] = D[i];
        }
    }
    int find(int x) {
        while (x != link[x]) x = link[x];
        return x;
    }
    void merge(int a, int b) {
        a = find(a);
        b = find(b);
        if (a == b) return;
        sz[a] += b;
        link[b] = a;
        seq[a].push_back(b);
        u[a] += u[b];
        d[a] += d[b];
    }
    ll cur_time = 0, ans = 0;
    void calc(int a, vector<int> &U, vector<int> &D) {
        for (int i = 0; i < seq[a].size(); i++) {
            if (seq[a][i] == a) {
                cur_time += 1ll*D[seq[a][i]];
                ans += 1ll*cur_time*U[seq[a][i]];
            }
            else calc(seq[a][i], U, D);
        }
    }
};

struct s {
    ll u, d;
    int i;
    bool operator<(const s &other) const {
        // u/d < other.u/other.d
        return 1ll*u*other.d < 1ll*d*other.u;
    }
};

long long scheduling_cost(vector<int> p, vector<int> u, vector<int> d) {
    int n = p.size();
    vector<vector<int>> adj(n);
    for (int i = 1; i < n; i++) adj[p[i]].push_back(i);
    priority_queue<s> pq;
    for (int i = 1; i < n; i++) pq.push({u[i], d[i], i});
    DSU dsu(n, u, d);
    while (!pq.empty()) {
        s a = pq.top();
        pq.pop();
        int x = dsu.find(a.i);
        if (x != a.i || dsu.u[x] != a.u || dsu.d[x] != a.d) continue;
        int y = dsu.find(p[a.i]);
        dsu.merge(y, x);
        if (y != 0) pq.push({dsu.u[y], dsu.d[y], y});
    }
    dsu.calc(0, u, d);
	return dsu.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...