Submission #1095795

#TimeUsernameProblemLanguageResultExecution timeMemory
1095795LucaLucaMStrange Device (APIO19_strange_device)C++17
100 / 100
1188 ms69228 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

using ll = long long;
using i128 = __int128;

int main() {
//  freopen("input.txt", "r", stdin);

  int n;
  ll A, B;
  std::cin >> n >> A >> B;

  if ((i128) A * B / std::__gcd(A, B + 1) > 1e18) {
    ll answer = 0;
    for (int i = 0; i < n; i++) {
      ll l, r;
      std::cin >> l >> r;
      answer += r - l + 1;
    }
    std::cout << answer;
    return 0;
  }

  ll R = (i128) A * B / std::__gcd(A, B + 1);

  std::vector<std::pair<ll, int>> events;
  bool coverAll = false;

  for (int i = 0; i < n; i++) {
    ll l, r;
    std::cin >> l >> r;
    if (r - l + 1 >= R) {
      coverAll = true;
    }
    l %= R;
    r %= R;
    if (l <= r) {
      events.push_back({l, +1});
      events.push_back({r + 1, -1});
    } else {
      events.push_back({0, +1});
      events.push_back({r + 1, -1});
      events.push_back({l, +1});
      events.push_back({R, -1});
    }
  }

  if (coverAll) {
    std::cout << R;
    return 0;
  }

  events.push_back({R, 0});
  std::sort(events.begin(), events.end());
  i128 last = 0;
  int delta = 0;
  ll answer = 0;

  for (const auto &[pos, add] : events) {
    if (delta >= 1) {
      answer += pos - last;
    }
    delta += add;
    last = pos;
  }

  std::cout << answer;

  return 0;
}
#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...