Submission #718301

#TimeUsernameProblemLanguageResultExecution timeMemory
718301potato167Job Scheduling (IOI19_job)C++17
100 / 100
317 ms20788 KiB
#include "job.h"
#include <bits/stdc++.h>


long long scheduling_cost(std::vector<int> p, std::vector<int> u, std::vector<int> d) {
	int n=p.size();
	struct _job
	{
		long long cost;
		long long time;
		int ind;
	};
	std::vector<int> par(n);
	std::vector<_job> val(n);
	long long ans=0;
	for(int i=0;i<n;i++){
		par[i]=i;
		val[i].cost=(long long)u[i];
		val[i].time=(long long)d[i];
		val[i].ind=i;
		ans+=val[i].cost*val[i].time;
	}
	auto concat_job=[&](_job &l,_job r)->void{
		ans+=l.time*r.cost;
		l.time+=r.time;
		l.cost+=r.cost;
	};
	auto comp_job=[&](_job l,_job r)->bool{
		return l.cost*r.time<l.time*r.cost;
	};
	auto root=[&](auto self,int a)->int{
		if(a==par[a]) return a;
		par[a]=self(self,par[a]);
		return par[a];
	};
	std::priority_queue<_job,std::vector<_job>,std::function<bool(_job,_job)>> pq(comp_job);
	int t=-1;
	for(int i=0;i<n;i++){
		if(p[i]==-1) t=i;
	}
	std::vector<int> seen(n);
	for(int i=0;i<n;i++){
		if(i!=t){
			pq.push(val[i]);
		}
	}
	while(!pq.empty()){
		_job tmp=pq.top();
		pq.pop();
		if(seen[tmp.ind]) continue;
		if(val[tmp.ind].cost!=tmp.cost||val[tmp.ind].time!=tmp.time) continue;
		seen[tmp.ind]=1;
		par[tmp.ind]=p[tmp.ind];
		int r=root(root,tmp.ind);
		concat_job(val[r],tmp);
		if(r!=t) pq.push(val[r]);
	}
	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...