Submission #117891

#TimeUsernameProblemLanguageResultExecution timeMemory
117891nvmdavaRoller Coaster Railroad (IOI16_railroad)C++17
100 / 100
1484 ms77388 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;
#define N 200005
#define ff first
#define ss second
vector<pair<int, pair<int, int> > > f;
int p[N];

int find(int v){
   return (v == p[v] ? v : p[v] = find(p[v]));
}

bool unite(int v, int u){
   v = find(v);
   u = find(u);
   if(v == u) return 0;
   p[v] = u;
   return 1;
}

map<int, int> sw;
map<int, vector<int> > in;
long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
   int n = s.size();
   s.push_back(1000000001);
   t.push_back(1);
   for(int i = 0; i <= n; i++){
      sw[s[i]]++;
      p[i] = i;
      sw[t[i]]--;
      in[s[i]].push_back(i);
      in[t[i]].push_back(i);
   }
   long long res = 0;
   int bal = 0, last = 0, lastid = n;

   for(auto x : sw){
      if(bal > 0){
         res += 1LL * bal * (x.ff - last);
      }
      for(int y : in[x.ff]){
         f.push_back({ bal == 0 ? x.ff - last : 0, {y, lastid}});
         lastid = y;
         last = x.ff;
      }

      bal += x.ss;
   }
   sort(f.begin(), f.end());
   for(auto x : f)
      res += x.ff * unite(x.ss.ff, x.ss.ss);
   return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...