제출 #188170

#제출 시각아이디문제언어결과실행 시간메모리
188170oolimryRoller Coaster Railroad (IOI16_railroad)C++14
100 / 100
330 ms20916 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; long long balance[400005]; int p[400005]; vector<pair<int, pair<int,int> > > edges; int findSet(int u){ if(u == p[u]) return u; else return p[u] = findSet(p[u]); } bool unionSet(int u, int v){ int x = findSet(u); int y = findSet(v); if(x == y) return false; p[x] = y; return true; } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { s.push_back(2e9); t.push_back(1); int n = (int) s.size(); vector<long long> points; for(int i = 0;i < n;i++) points.push_back(s[i]), points.push_back(t[i]); sort(points.begin(),points.end()); points.erase(unique(points.begin(),points.end()), points.end()); for(int i = 0;i < (int) points.size();i++) p[i] = i; for(int i = 0;i < n;i++){ s[i] = lower_bound(points.begin(),points.end(),s[i]) - points.begin(); t[i] = lower_bound(points.begin(),points.end(),t[i]) - points.begin(); balance[s[i]]++; balance[t[i]]--; unionSet(s[i],t[i]); } long long ans = 0, acc = 0; for(int i = 0;i < (int) points.size() - 1;i++){ acc += balance[i]; if(acc == 0) edges.push_back({points[i+1] - points[i], {i, i+1}}); else{ unionSet(i,i+1); if(acc > 0) ans += (points[i+1] - points[i]) * acc; } } sort(edges.begin(),edges.end()); for(auto& e : edges){ if(unionSet(e.second.first,e.second.second)){ ans += e.first; } } 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...