Advertisement
erek1e

IOI '08 P4 - Teleporters

Jul 17th, 2023
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  9.     int n, m; cin >> n >> m;
  10.     vector<int> L(n), R(n);
  11.     for (int i = 0; i < n; ++i) cin >> L[i] >> R[i];
  12.     auto getPartner = [&](int i) {return i ^ 1;};
  13.  
  14.     vector<pair<int, int>> ordered;
  15.     for (int i = 0; i < n; ++i) {
  16.         ordered.emplace_back(L[i], 2*i);
  17.         ordered.emplace_back(R[i], 2*i+1);
  18.     }
  19.     sort(ordered.begin(), ordered.end());
  20.     vector<int> nxt(2*n);
  21.     for (int i = 0; i < 2*n; ++i) {
  22.         nxt[ordered[i].second] = (i+1 == 2*n ? 2*n : ordered[i+1].second);
  23.     }
  24.  
  25.     vector<int> edge(2*n);
  26.     for (int i = 0; i < 2*n; ++i) edge[i] = nxt[getPartner(i)];
  27.    
  28.     // build cycles and chain
  29.     int start = ordered.front().second;
  30.  
  31.     vector<bool> seen(2*n);
  32.     vector<int> cycleSizes;
  33.  
  34.     auto findFrom = [&](int pos) {
  35.         int sz = 0;
  36.         while (pos != 2*n && !seen[pos]) {
  37.             seen[pos] = true;
  38.             pos = edge[pos];
  39.             ++sz;
  40.         }
  41.         return sz;
  42.     };
  43.  
  44.     int pathSize = findFrom(start);
  45.     for (int first = 0; first < 2*n; ++first) {
  46.         if (seen[first]) continue;
  47.         cycleSizes.push_back(findFrom(first));
  48.     }
  49.     sort(cycleSizes.begin(), cycleSizes.end());
  50.     while (m && !cycleSizes.empty()) {
  51.         pathSize += cycleSizes.back() + 2;
  52.         cycleSizes.pop_back();
  53.         --m;
  54.     }
  55.     pathSize += 4 * (m/2) + (m&1);
  56.     cout << pathSize << endl;
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement