제출 #501684

#제출 시각아이디문제언어결과실행 시간메모리
501684600MihneaTeleporters (IOI08_teleporters)C++17
100 / 100
447 ms44504 KiB
#include <bits/stdc++.h>

using namespace std;


signed main() {
  ios::sync_with_stdio(0); cin.tie(0);

 /// freopen ("input", "r", stdin);

  int N, E;
  cin >> N >> E;
  vector<pair<int, int>> guys;
  for (int i = 0; i < N; i++) {
    int A, B;
    cin >> A >> B;
    guys.push_back({A, i});
    guys.push_back({B, i});
  }
  sort(guys.begin(), guys.end());
  vector<int> SM(N);
  for (int i = 0; i < 2 * N; i++) {
    SM[guys[i].second] += i;
  }
  vector<int> nxt(2 * N + 1);
  for (int i = 0; i < 2 * N; i++) {
    int Type = guys[i].second;
    int Other = SM[Type] - i;
    assert(0 <= Other && Other < 2 * N);
    nxt[i] = Other + 1;

  }

  bool WannaCheck = true;
  WannaCheck = false;
  if (WannaCheck) {
    map<int, int> B;
    for (int i = 0; i < 2 * N; i++) {
      B[nxt[i]]++;
    }
    for (int i = 1; i < 2 * N + 1; i++) {
      assert(B.count(i) && B[i] == 1);
    }
  }
  vector<bool> vis(2 * N + 1, false);

  int ZDApath = 0;
  for (int i = 0; i != 2 * N; i = nxt[i]) {
    ZDApath++;
    assert(!vis[i]);
    vis[i] = true;
  }

  vis[2 * N] = true;
  vector<int> SAD;
  for (int i = 0; i <= 2 * N; i++) {
    if (!vis[i]) {

      int LEN = 1;
      vis[i] = true;
      for (int j = nxt[i]; j != i; j = nxt[j]) {
        LEN++;
        assert(!vis[j]);
        vis[j] = true;
      }
      SAD.push_back(LEN);
    }
  }
  sort(SAD.begin(), SAD.end());
  int S = ZDApath;
  ///cout << N << " " << E << "\n";
  while (!SAD.empty() && E) {
    E--;
    S += 2 + SAD.back();
    SAD.pop_back();

  }
  for (int j = 1; j <= E; j++) {
    if (j & 1) {
      S += 1;
    } else {
      S += 3;
    }
  }
  cout << S << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...