제출 #1117046

#제출 시각아이디문제언어결과실행 시간메모리
1117046epicci23Roller Coaster Railroad (IOI16_railroad)C++17
0 / 100
126 ms23480 KiB
#include "bits/stdc++.h" #include "railroad.h" #define ll long long #define all(v) v.begin() , v.end() #define sz(a) (ll)a.size() using namespace std; const ll INF = 1e18; struct DSU{ vector<ll> par,siz; DSU(ll _n){ par.assign(_n,0); iota(all(par),0); siz.assign(_n,1); } ll find(ll a){ if(par[a]==a) return a; return par[a]=find(par[a]); } void unite(ll a,ll b){ a = find(a) , b = find(b); if(a == b) return; if(siz[a] > siz[b]) swap(a, b); siz[b] += siz[a]; par[a] = b; } }; ll plan_roller_coaster(vector<int> _s, vector<int> _t){ ll n = sz(_s); array<ll,2> ar[n + 5]; for(ll i = 1; i <= n; i++) ar[i][0] = _s[i], ar[i][1] = _t[i]; ar[0] = {INF,1LL}; vector<ll> zip; for(ll i=0;i<=n;i++){ zip.push_back(ar[i][0]); zip.push_back(ar[i][1]); } sort(all(zip)); zip.erase(unique(all(zip)),zip.end()); auto Get = [&](ll val) -> ll{ ll it = lower_bound(all(zip),val) - zip.begin(); return it; }; ll m = sz(zip); vector<ll> art(m+5,0),eks(m+5,0); DSU dsu(m+5); for(ll i = 0; i <= n ; i++){ ll a = Get(ar[i][0]); art[a]++; ll b = Get(ar[i][1]); eks[b]++; dsu.unite(a,b); } ll pa=0,pb=0,ans=0; for(ll i=0;i<m;i++){ pa += art[i]; pb += eks[i]; if(pa > pb) ans+=(pa-pb)*(zip[i+1]-zip[i]); if(pa != pb) dsu.unite(i,i+1); } vector<array<ll,3>> edges; for(ll i=0;i+1<m;i++){ if(dsu.find(i)!=dsu.find(i+1)) edges.push_back({zip[i+1]-zip[i],dsu.find(i),dsu.find(i+1)}); } sort(all(edges)); for(auto x:edges){ if(dsu.find(x[1])!=dsu.find(x[2])){ ans += x[0]; dsu.unite(x[1],x[2]); } } return ans; } /*void _(){ ll n; cin >> n; array<ll,2> ar[n+5]; for(ll i=1;i<=n;i++) cin >> ar[i][0] >> ar[i][1]; ar[0] = {INF,1}; vector<ll> zip; for(ll i=0;i<=n;i++){ zip.push_back(ar[i][0]); zip.push_back(ar[i][1]); } sort(all(zip)); zip.erase(unique(all(zip)),zip.end()); auto Get = [&](ll val){ ll it = lower_bound(all(zip),val) - zip.begin(); return it; }; ll m = sz(zip); vector<ll> art(m+5,0),eks(m+5,0); DSU dsu(m+5); for(ll i = 0; i <= n ; i++){ ll a = Get(ar[i][0]); art[a]++; ll b = Get(ar[i][1]); eks[b]++; dsu.unite(a,b); } ll pa=0,pb=0,ans=0; for(ll i=0;i<m;i++){ pa += art[i]; pb += eks[i]; if(pa > pb) ans+=(pa-pb)*(zip[i+1]-zip[i]); if(pa != pb) dsu.unite(i,i+1); } vector<array<ll,3>> edges; for(ll i=0;i+1<m;i++){ if(dsu.find(i)!=dsu.find(i+1)) edges.push_back({zip[i+1]-zip[i],i,i+1}); } sort(all(edges)); for(auto x:edges){ if(dsu.find(x[1])!=dsu.find(x[2])){ ans += x[0]; dsu.unite(x[1],x[2]); } } cout << ans << '\n'; } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); ll tc=1;//cin >> tc; while(tc--) _(); return 0; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...