Submission #289463

#TimeUsernameProblemLanguageResultExecution timeMemory
289463KastandaRoller Coaster Railroad (IOI16_railroad)C++11
34 / 100
2045 ms27584 KiB
// M #include<bits/stdc++.h> #include "railroad.h" using namespace std; typedef long long ll; int n; map < int , int > P; int Find(int v) { return (!P[v] ? v : (P[v] = Find(P[v]))); } inline bool Merge(int v, int u) { v = Find(v); u = Find(u); if (v == u) return 0; P[v] = u; return 1; } long long plan_roller_coaster(vector < int > S, vector < int > T) { n = (int)S.size(); vector < pair < int , int > > A; for (int i = 0; i < n; i ++) { A.push_back({S[i], 1}); A.push_back({T[i], -1}); Merge(S[i], T[i]); } A.push_back({(int)(1e9 + 9), 1}); A.push_back({1, -1}); sort(A.begin(), A.end()); ll Cur = 0, tot = 0; for (int i = 0; i + 1 < (int)A.size(); i ++) { Cur += A[i].second; if (Cur > 0) tot += Cur * (A[i + 1].first - A[i].first); if (Cur) Merge(A[i].first, A[i + 1].first); } vector < int > R((int)A.size() - 1); iota(R.begin(), R.end(), 0); sort(R.begin(), R.end(), [&](int i, int j){return A[i + 1].first - A[i].first < A[j + 1].first - A[j].first;}); for (int i : R) if (Merge(A[i].first, A[i + 1].first)) tot += A[i + 1].first - A[i].first; return tot; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...