Submission #587358

#TimeUsernameProblemLanguageResultExecution timeMemory
587358blueJob Scheduling (IOI19_job)C++17
100 / 100
676 ms23984 KiB
#include "job.h"
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

using vi = vector<int>;
using ll = long long;
using vll = vector<ll>;
#define sz(x) int(x.size())

ll res = 0;

const int mx = 200'000;

struct dsu
{
	vi par = vi(1+mx);
	vi st = vi(1+mx, 1);
	vi peak = vi(1+mx);

	dsu()
	{
		for(int i = 0; i <= mx; i++)
		{
			par[i] = i;
			peak[i] = i;
		}
	}

	int root(int u)
	{
		if(par[u] == u) return u;
		else return (par[u] = root(par[u]));
	}

	int getpeak(int u)
	{
		return peak[root(u)];
	}

	bool join(int u, int v, int p)
	{
		u = root(u);
		v = root(v);

		if(u == v)
			return 0;

		if(st[u] < st[v])
			swap(u, v);

		par[v] = u;
		st[u] += st[v];
		peak[u] = p;

		return 1;
	}
};	

int n;

vi p;
vll u, d;

struct temple
{
	int i;
};

bool operator < (temple A, temple B)
{
	if(d[A.i]*u[B.i] == d[B.i]*u[A.i])
		return A.i < B.i;
	else
		return d[A.i]*u[B.i] < d[B.i]*u[A.i];
}

ll scheduling_cost(vi p_, vi u_, vi d_) 
{
	p = p_;
	n = sz(p);

	u = d = vll(n);
	for(int i = 0; i < n; i++)
	{
		u[i] = u_[i];
		d[i] = d_[i];
	}

	dsu ds;

	for(int i = 0; i < n; i++)
		res += u[i]*d[i];

	set<temple> S;
	for(int i = 1; i < n; i++)
		S.insert(temple{i});	

	//combined values are stored at the paek

	for(int t = 0; t < n-1; t++)
	{
		int a = S.begin()->i;
		S.erase(S.begin());

		int pa = ds.getpeak(a);

		int b = p[pa];
		int pb = ds.getpeak(b);

		res += d[pb] * u[pa];

		
		ds.join(pa, pb, pb);

		if(pb == 0)
		{
			d[pb] += d[pa];
			u[pb] += u[pa];
		}
		else
		{
			S.erase(temple{pb});

			d[pb] += d[pa];
			u[pb] += u[pa];

			S.insert(temple{pb});
		}
	}


	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...