제출 #139043

#제출 시각아이디문제언어결과실행 시간메모리
139043hamzqq9Roller Coaster Railroad (IOI16_railroad)C++14
100 / 100
1142 ms34108 KiB
#include "railroad.h" #include<bits/stdc++.h> #define st first #define nd second #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define umax(x,y) x=max(x,y) #define umin(x,y) x=min(x,y) #define ll long long #define ii pair<int,int> #define iii pair<int,ii> #define iiii pair<ii,ii> #define sz(x) ((int) x.size()) #define orta ((bas+son)/2) #define all(x) x.begin(),x.end() #define inf 1000000000 #define MOD 1000000007 #define N 400005 #define LOG 20 #define KOK 300 #define EPS 0.0000001 using namespace std; int n,cnt; vector<int> pre,dad; int tut[N]; struct edge { int a,b,c; }; int find(int x) {return dad[x]=(x==dad[x]?x:find(dad[x]));} void merge(int x,int y) { dad[find(x)]=find(y); } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { map<int,int> mp; n=sz(s); for(int i=0;i<n;i++) { mp[s[i]]=1; mp[t[i]]=1; } mp[inf]=1; for(auto& x:mp) { x.nd=++cnt; tut[cnt]=x.st; } dad=pre=vector<int>(cnt+5,0); for(int i=1;i<=cnt;i++) dad[i]=i; for(int i=0;i<n;i++) { // cerr<<s[i]<<" "<< t[i]<<"\n"; s[i]=mp[s[i]]; t[i]=mp[t[i]]; merge(s[i],t[i]); // cerr<< "to : \n"; // cerr<<s[i] <<" "<<t[i]<<"\n"; // cerr<<"-------------------\n"; if(s[i]<=t[i]) { pre[s[i]]++; pre[t[i]]--; } else { pre[t[i]]--; pre[s[i]]++; } } ll ans=0; vector<edge> q; for(int i=1;i<cnt;i++) { pre[i]+=pre[i-1]; // cerr<<i << " " << pre[i] <<"\n"; if(pre[i]>1) { ans+=(ll)(pre[i]-1)*(tut[i+1]-tut[i]); } if(pre[i]!=1) merge(i,i+1); if(find(i)!=find(i+1)) q.pb({i,i+1,tut[i+1]-tut[i]}); } sort(all(q),[](edge x,edge y) { return x.c<y.c; }); for(auto x:q) { if(find(x.a)!=find(x.b)) { merge(x.a,x.b); ans+=x.c; } } 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...