Submission #208637

#TimeUsernameProblemLanguageResultExecution timeMemory
208637eriksuenderhaufJob Scheduling (IOI19_job)C++14
100 / 100
204 ms31216 KiB
//#pragma GCC optimize("O3")
#include "job.h"
#include <bits/stdc++.h>
#define pii pair<int,int>
#define vi vector<int>
#define vii vector<pii>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 5;
int U[MAXN], D[MAXN];

bool operator<(pii lhs, pii rhs) {
	return (ll)lhs.fi * (ll)rhs.se < (ll)rhs.fi * (ll)lhs.se;
}

struct cmp {
	bool operator()(int lhs, int rhs) {
		return mp(U[lhs],D[lhs]) < mp(U[rhs],D[rhs]);
	}
};

priority_queue<int,vi,cmp> pq[MAXN];
int nx[MAXN], idx[MAXN];
vi ans;

void merge(int u) {
	while (!pq[u].empty()) {
		int v = pq[u].top();
		if (mp(U[v], D[v]) < mp(U[u], D[u]))
			return;
		pq[u].pop();
		nx[idx[u]] = v;
		idx[u] = idx[v];
		U[u] += U[v];
		D[u] += D[v];
		if (pq[u].size() < pq[v].size())
			swap(pq[u], pq[v]);
		while (!pq[v].empty()) {
			pq[u].push(pq[v].top());
			pq[v].pop();
		}
	}
}

void dfs(int u) {
	ans.pb(u);
	while (!pq[u].empty()) {
		int v = pq[u].top(); pq[u].pop();
		dfs(v);
	}
}

ll scheduling_cost(vi p, vi u, vi d) {
	int n = p.size();
	for (int i = 0; i < n; i++) {
		tie(idx[i],nx[i]) = mp(i,-1);
		tie(U[i],D[i]) = mp(u[i], d[i]);
	}
	for (int i = n-1; i > 0; i--) {
		merge(i);
		pq[p[i]].push(i);
	}
	merge(0);
	dfs(0);
	sort(ans.begin(), ans.end(), [](int lhs, int rhs) {
		return mp(U[lhs],D[lhs]) < mp(U[rhs],D[rhs]);
	});
	ll sm = 0, ret = 0;
	for (int i = ans.size()-1; i >= 0; i--) {
		for (int j = ans[i]; j != -1; j = nx[j]) {
			sm += d[j];
			ret += sm * u[j];
		}
	}
	return ret;
}
#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...