Submission #140796

#TimeUsernameProblemLanguageResultExecution timeMemory
140796NamnamseoRoller Coaster Railroad (IOI16_railroad)C++17
100 / 100
699 ms36400 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;

#define eb emplace_back
#define x first
#define y second

using pp=pair<int,int>;
using ll=long long;

map<int,int> df;

const int inf = int(1e9) + 10;
const int maxn = int(4e5) + 10;

int par[maxn];
vector<pp> D;

int R(int x){ return (par[x]==x) ? x : (par[x]=R(par[x])); }

vector<tuple<int,int,int>> ev;

long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
	int n = s.size();

	for(int i=0; i<n; ++i) {
		df[s[i]] += -1;
		df[t[i]] += +1;
	}

	df[0] += +1;
	df[inf] += -1;

	D = vector<pp>(df.begin(), df.end());

	int sz = D.size();
	iota(par, par+sz, 0);

	ll ans = 0;
	int lev = 0, last = 0;

	for(int i=0; i<sz; ++i) {
		auto &tmp = D[i];
		if(lev < 0) {
			ans += (tmp.x - last) * 1ll * (-lev);
		}
		if(lev && i) {
			par[R(i-1)] = i;
		}
		last = tmp.x;
		lev += tmp.y;
	}

	auto fnd = [&](int x){ return int(lower_bound(D.begin(), D.end(), pp(x, -inf)) - D.begin()); };
	for(int i=0; i<n; ++i) {
		par[R(fnd(s[i]))] = R(fnd(t[i]));
	}
	par[R(fnd(0))] = R(fnd(inf));

	for(int i=0; i+1<sz; ++i) {
		int va = R(i), vb = R(i+1);
		if(va != vb) ev.eb(D[i+1].x-D[i].x, va, vb);
	}

	sort(ev.begin(), ev.end());
	for(auto &tmp:ev) {
		int v, a, b; tie(v, a, b) = tmp;
		if(R(a) != R(b)) {
			ans += v;
			par[R(a)] = R(b);
		}
	}

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