Submission #1368462

#TimeUsernameProblemLanguageResultExecution timeMemory
1368462viduxRoller Coaster Railroad (IOI16_railroad)C++17
100 / 100
99 ms14516 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct DSU {
	int n;	
	vector<int> sz, par;
	DSU(int _n) {
		n = _n;
		sz = vector<int>(n, 1);
		par = vector<int>(n);
		for (int i = 0; i < n; i++) par[i] = i;
	}
	int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }
	bool join(int x, int y) {
		x = find(x), y = find(y);
		if (x == y) return 0;
		if (sz[x] < sz[y]) swap(x, y);
		sz[x] += sz[y];
		par[y] = x;
		return 1;
	}
};
long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
	s.push_back(1e9), t.push_back(1);
	int n = (int) s.size();
	DSU dsu(n);
	vector<array<int, 3>> p(2*n), e(2*n-1);
	for (int i = 0; i < n; i++) {
		p[2*i] = {s[i], 1, i};
		p[2*i+1] = {t[i], -1, i};
	}
	sort(p.begin(), p.end());
	ll ans = 0;
	ll d = 0;
	for (int i = 0; i < 2*n-1; i++) {
		d += p[i][1];
		ans += max(0ll, d)*(p[i+1][0]-p[i][0]);
		e[i] = {p[i+1][0]-p[i][0], p[i][2], p[i+1][2]};
		if (d || p[i][0] == p[i+1][0]) dsu.join(p[i][2], p[i+1][2]);
	}
	sort(e.begin(), e.end());
	for (int i = 0; i < 2*n-1; i++) ans += dsu.join(e[i][1], e[i][2])*e[i][0];
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...