제출 #170717

#제출 시각아이디문제언어결과실행 시간메모리
170717dennisstarRoller Coaster Railroad (IOI16_railroad)C++11
100 / 100
404 ms48232 KiB
#include "railroad.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define ryan bear
#define all(V) ((V).begin()), ((V).end())
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef vector<int> vim;
typedef vector<ll> vlm;

int par[400010], deg[400010], chk[400010];
int get(int i) {
	if (par[i]==i) return i;
	else return par[i]=get(par[i]);
}
vim V[400010], cp;
int N, M, tp;
ll ans;

void dfs(int now, int num) {
	chk[now]=num;
	for (int i:V[now]) if (!chk[i]) dfs(i, num);
}

ll plan_roller_coaster(vim s, vim t) {
	N=s.size();

	//coordinate compression
	for (int i:s) cp.push_back(i);
	for (int i:t) cp.push_back(i);
	sort(all(cp)); cp.erase(unique(all(cp)), cp.end()); M=cp.size();
	vim S, T;
	S.push_back(0); T.push_back(0);
	for (int i:s) {
		int lb=lower_bound(all(cp), i)-cp.begin();
		S.push_back(lb+1);
		deg[lb+1]++;
	}
	for (int i:t) {
		int lb=lower_bound(all(cp), i)-cp.begin();
		T.push_back(lb+1);
		deg[lb+1]--;
	}

	//generate edges
	for (int i=1; i<=N; i++) V[S[i]].push_back(T[i]);
	for (int i=1; i<M; i++) {
		int req=(i==1?1:0);
		int now=req-deg[i];
		if (now>0) {
			deg[i]+=now;
			deg[i+1]-=now;
			V[i].push_back(i+1);
		}
		else if (now<0) { 
			deg[i]+=now;
			deg[i+1]-=now;
			V[i+1].push_back(i);
			ans+=(ll)abs(now)*(cp[i]-cp[i-1]);
		}
	}

	//mst
	for (int i=1; i<M; i++) if (!chk[i]) dfs(i, ++tp);
	for (int i=1; i<=tp; i++) par[i]=i;
	vector<pii> e;
	for (int i=1; i<M; i++) if (chk[i]!=chk[i+1]) e.push_back({cp[i]-cp[i-1], i});
	sort(all(e));
	for (pii pi:e) {
		int x1=get(chk[pi.se]), x2=get(chk[pi.se+1]);
		if (x1!=x2) {
			ans+=(ll)pi.fi;
			par[x2]=x1;
		}
	}

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