제출 #707710

#제출 시각아이디문제언어결과실행 시간메모리
707710AdamGSJob Scheduling (IOI19_job)C++17
100 / 100
229 ms17880 KiB
//#include "job.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=2e5+7;
struct comp {
	bool operator()(pair<pair<ll,ll>,int>a, pair<pair<ll,ll>,int>b) {
		return a.st.st*b.st.nd>=a.st.nd*b.st.st;
	}
};
priority_queue<pair<pair<ll,ll>,int>,vector<pair<pair<ll,ll>,int>>,comp>q;
int F[LIM], odw[LIM], n;
ll ans, aktt;
pair<ll,ll>T[LIM];
int fnd(int x) {
	if(F[x]==x) return x;
	return F[x]=fnd(F[x]);
}
ll scheduling_cost(vector<int>P, vector<int>U, vector<int>D) {
	n=P.size();
	rep(i, n) {
		T[i]={D[i], U[i]};
		F[i]=i;
		q.push({T[i], i});
	}
	while(!q.empty()) {
		pair<ll,ll>x=q.top().st;
		int p=q.top().nd; q.pop();
		if(odw[p]) continue;
		odw[p]=1;
		if(P[p]==-1 || odw[fnd(P[p])]) {
			aktt+=x.st;
			ans+=aktt*x.nd;
			continue;
		}
		int a=fnd(P[p]);
		ans-=T[a].nd*T[p].st;
		T[a].st+=T[p].st;
		T[a].nd+=T[p].nd;
		F[p]=a;
		q.push({T[a], a});
	}
	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...