Submission #1177533

#TimeUsernameProblemLanguageResultExecution timeMemory
1177533onlk97Roller Coaster Railroad (IOI16_railroad)C++20
100 / 100
465 ms37992 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; struct DSU{ vector <int> dsu; void init(int n){ for (int i=0; i<=n; i++) dsu.push_back(i); } int prt(int n){ if (dsu[n]==n) return n; return dsu[n]=prt(dsu[n]); } void unn(int u,int v){ dsu[prt(u)]=dsu[prt(v)]; } }; long long plan_roller_coaster(vector <int> s,vector <int> t){ s.push_back(2e9); t.push_back(1); int n=s.size(); set <int> loc; for (int i:s) loc.insert(i); for (int i:t) loc.insert(i); vector <int> vloc; for (int i:loc) vloc.push_back(i); for (int&i:s) i=lower_bound(vloc.begin(),vloc.end(),i)-vloc.begin(); for (int&i:t) i=lower_bound(vloc.begin(),vloc.end(),i)-vloc.begin(); int sz=vloc.size(); long long in[sz],out[sz]; for (int i=0; i<sz; i++) in[i]=out[i]=0; DSU d; d.init(sz+1); for (int i=0; i<n; i++){ out[s[i]]++; in[t[i]]++; d.unn(s[i],t[i]); } long long ans=0; for (int i=0; i+1<sz; i++){ if (out[i]>in[i]){ long long dif=out[i]-in[i]; in[i]+=dif; out[i+1]+=dif; ans+=dif*(vloc[i+1]-vloc[i]); d.unn(i,i+1); } else if (out[i]<in[i]){ long long dif=in[i]-out[i]; out[i]+=dif; in[i+1]+=dif; d.unn(i,i+1); } } vector <pair <int,int> > vec; for (int i=0; i+1<sz; i++) vec.push_back({vloc[i+1]-vloc[i],i}); sort(vec.begin(),vec.end()); for (auto i:vec){ if (d.prt(i.second)!=d.prt(i.second+1)){ d.unn(i.second,i.second+1); ans+=i.first; } } return ans; }

Compilation message (stderr)

railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...