제출 #1042943

#제출 시각아이디문제언어결과실행 시간메모리
1042943ReLiceRoller Coaster Railroad (IOI16_railroad)C++17
34 / 100
781 ms524288 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define vll vector<ll>
#define fr first
#define bc back()
#define sc second
const ll inf=2e9;
const ll N=5e5+7;
vector<vll> g(N);
ll p[N],siz[N];
ll anc(ll a){
	return (a==p[a] ? a : p[a]=anc(p[a]));
}
bool uni(ll a,ll b){
	a=anc(a),b=anc(b);
	if(a==b)return false;
	if(siz[a]>siz[b])swap(a,b);
	siz[b]+=siz[a];
	p[a]=b;
	return true;
}
long long plan_roller_coaster(vector<int> s, vector<int> t) {
    ll i;
    ll n=s.size();
    
    //compress;
    set<int> st;
    map<int,ll> pos,mp;
    for(i=0;i<n;i++){
		st.insert(s[i]);
		st.insert(t[i]);
	}
	st.insert(inf);
	ll c=0;
	for(auto i : st){
		pos[i]=c;
		mp[c]=i;
		c++;
	}
	vll val(c);
    for(i=0;i<c;i++){
		val[i]=mp[i];
		p[i]=i;
		siz[i]=1;
	}
    
    vll vs,vt;
    vll pref(c);
    pref[c-1]++;
    pref[0]--;
    for(i=0;i<n;i++){
		vs.pb(pos[s[i]]);
		vt.pb(pos[t[i]]);
		g[vs[i]].pb(vt[i]);
		pref[vs[i]]++;
		pref[vt[i]]--;
	}
	
	ll ans=0;
	
	for(i=0;i<c-1;i++){
		if(i>0)pref[i]+=pref[i-1];
		ll C=pref[i];
		while(C>0){
			ans+=(val[i+1]-val[i]);
			g[i+1].pb(i);
			C--;
		}
		while(C<0){
			g[i].pb(i+1);
			C++;
		}
	}
	
	uni(0,c-1);
	for(i=0;i<c;i++){
		for(auto j : g[i]){
			uni(i,j);
		}
	}
	
	vector<pair<ll,ll>> edges;
	for(i=1;i<c;i++){
		edges.pb({val[i]-val[i-1],i});
	}
	
	sort(edges.begin(),edges.end());
	
	for(i=0;i<(ll)edges.size();i++){
		if(uni(edges[i].sc,edges[i].sc-1)){
			ans+=edges[i].fr;
		}
	}
	
	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...