제출 #591511

#제출 시각아이디문제언어결과실행 시간메모리
591511yutabiRoller Coaster Railroad (IOI16_railroad)C++14
30 / 100
127 ms12624 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; #define pb push_back typedef long long ll; typedef pair <int,int> ii; vector <int> DSU; int find_parent(int a) { if(DSU[a]==a) { return a; } return DSU[a]=find_parent(DSU[a]); } bool make_union(int a, int b) { a=find_parent(a); b=find_parent(b); if(a==b) { return 0; } DSU[b]=a; return 1; } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { int n = (int) s.size(); vector <ii> nw_s; vector <ii> nw_t; for(int i=0;i<n;i++) { nw_s.pb(ii(s[i],i)); nw_t.pb(ii(t[i],i)); } vector <ii> nw; sort(nw_s.begin(),nw_s.end()); sort(nw_t.begin(),nw_t.end()); for(int i=0;i<n-1;i++) { nw.pb(ii(nw_t[i].second,nw_s[i+1].second)); } nw.pb(ii(nw_t[n-1].second,nw_s[0].second)); DSU=vector <int> (n); for(int i=0;i<n;i++) { DSU[i]=i; } ll ans=0; priority_queue <ii> pq; for(int i=0;i<n;i++) { make_union(nw[i].first,nw[i].second); if(i!=n-1) { ans+=max(t[nw[i].first]-s[nw[i].second],0); pq.push(ii(i,max(t[nw[i+1].first]-s[nw[i].second],0)+max(t[nw[i].first]-s[nw[i+1].second],0)-max(t[nw[i].first]-s[nw[i].second],0)-max(t[nw[i+1].first]-s[nw[i+1].second],0))); } } for(int i=0;i<n;i++) { //printf("%d %d\n",t[nw[i].first],s[nw[i].second]); } while(pq.size()) { int ptr=pq.top().first; int num=pq.top().second; pq.pop(); if(make_union(nw[ptr].first,nw[ptr+1].first)) { ans+=max(0,num); } } 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...