Submission #1200641

#TimeUsernameProblemLanguageResultExecution timeMemory
120064112345678Job Scheduling (IOI19_job)C++20
19 / 100
173 ms28604 KiB
#include "job.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int nx=2e5+5;

struct info
{
	ll c0, c1, idx, ver;
	bool operator< (const info &o) const {return c1*o.c0<c0*o.c1;}
} lst[nx];

ll n, dsu[nx], res, t;
multiset<info> s;

int find(int x)
{
	if (dsu[x]==x) return x;
	return dsu[x]=find(dsu[x]);
}

long long scheduling_cost(std::vector<int> p, std::vector<int> u, std::vector<int> d) {
	n=p.size();
	for (int i=0; i<n; i++)
	{
		lst[i].c0=u[i];
		lst[i].c1=d[i];
		lst[i].idx=i;
		lst[i].ver=0;
		res+=u[i]*d[i];
		if (i) s.insert(lst[i]);
	}
	while (!s.empty())
	{
		auto cur=*s.begin();
		s.erase(s.begin());
		if (lst[cur.idx].ver!=cur.ver) continue;
		int pv=find(p[cur.idx]);
		dsu[cur.idx]=pv;
		res+=lst[pv].c1*cur.c0;
		lst[pv].c0+=cur.c0;
		lst[pv].c1+=cur.c1;
		lst[pv].ver=++t;
		if (pv) s.insert(lst[pv]);
	}
	return res;
}
#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...