Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include "railroad.h"
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <map>
  7. #include <unordered_map>
  8.  
  9. #define X first
  10. #define Y second
  11. #define PB push_back
  12.  
  13. using namespace std;
  14.  
  15. typedef vector < int > vi;
  16. typedef long long ll;
  17. typedef pair < int , int > pii;
  18. typedef vector < pii > vp;
  19.  
  20. const int INF = 0x3f3f3f3f;
  21. const int N = 4e5 + 500;
  22.  
  23. bool cmp(pii A, pii B){
  24.     if(A.X - A.Y == B.X - B.Y) return A.X < A.Y;
  25.     return A.X - A.Y > B.X - B.Y;
  26. }
  27.  
  28. int n, m;
  29. vector < int > v;
  30. vector < pii > e;
  31. unordered_map < int , int > deg, par, out;
  32.  
  33. int pr(int x){
  34.     if(!par[x]) return par[x] = x;
  35.     if(x == par[x]) return x;
  36.     return par[x] = pr(par[x]);
  37. }
  38.  
  39. void mrg(int x,int y){
  40.     par[pr(x)] = pr(y);
  41. }
  42.  
  43. ll plan_roller_coaster(vi s, vi t) {
  44.     n = s.size();
  45.     for(int i = 0;i < n;i++){
  46.         deg[s[i]]++; deg[t[i]]--;
  47.         v.PB(s[i]), v.PB(t[i]);
  48.         mrg(s[i], t[i]);
  49.     }
  50.     sort(v.begin(), v.end());
  51.     v.erase(unique(v.begin(), v.end()), v.end());
  52.     n = (int)v.size();
  53.     ll sol = 0;
  54.     for(int i = 0;i < n;i++){
  55.         out[v[i]] = out[v[i - 1]] - deg[v[i]] + (i == 0) - (i == n - 1);
  56.         if(out[v[i]] < 0 && i != n - 1){
  57.             mrg(v[i], v[i + 1]);
  58.             sol -= (ll)(v[i + 1] - v[i]) * out[v[i]];
  59.         }
  60.         if(out[v[i]] == 0 && i != n - 1){
  61.             e.PB({v[i], v[i + 1]});
  62.         }
  63.         if(out[v[i]] > 0 && i != n - 1){
  64.             mrg(v[i], v[i + 1]);
  65.         }
  66.         //printf("OUT %d je %d\n:", v[i], out[v[i]]);
  67.     }
  68.     //printf("SOL   = %lld\n", sol);
  69.     sort(e.begin(), e.end(), cmp);
  70.     for(int i = 0;i < e.size();i++){
  71.         if(pr(e[i].X) != pr(e[i].Y)){
  72.             mrg(e[i].X, e[i].Y);
  73.             sol += e[i].Y - e[i].X;
  74.         }
  75.     }
  76.     return sol;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement