Submission #343982

#TimeUsernameProblemLanguageResultExecution timeMemory
343982spatarelStrange Device (APIO19_strange_device)C++17
100 / 100
792 ms34232 KiB
#include <stdio.h>
#include <algorithm>
#include <vector>

struct Event {
  long long index;
  int add;
};

bool operator < (const Event &a, const Event &b) {
  return a.index < b.index;
}

long long gcd(long long a, long long b) {
  long long r = a % b;
  while (r > 0) {
    a = b;
    b = r;
    r = a % b;
  }
  return b;
}

int main() {
  int n;
  long long A, B;
  scanf("%d%lld%lld", &n, &A, &B);
  long long AB = A / gcd(A, B + 1);
  if (AB < 2e18 / B) { // AB * B < 2e18
    AB *= B;
  } else {
    AB = 2e18;
  }
  bool allMarked = false;
  std::vector<Event> events;
  for (int i = 0; i < n; i++) {
    long long l, r;
    scanf("%lld%lld", &l, &r);
    if (r - l + 1 >= AB) {
      allMarked = true;
    } else {
      l %= AB;
      r %= AB;
      events.push_back(Event{l, +1});
      events.push_back(Event{r + 1, -1});
      if (l > r) {
        events.push_back(Event{0, +1});
        events.push_back(Event{AB, -1});
      }
    }
  }
  std::sort(events.begin(), events.end());
  int currentValue = 0;
  long long answer = 0;
  if (allMarked) {
    answer = AB;
  } else {
    long long currentPosition = 0;
    for (Event event : events) {
      if (currentValue > 0) {
        answer += event.index - currentPosition;
      }
      currentValue += event.add;
      currentPosition = event.index;
      /*
      printf("%lld %d (%d %lld)\n", event.index, event.add,
        currentValue, answer);//*/
    }
  }
  printf("%lld\n", answer);
  return 0;
}

Compilation message (stderr)

strange_device.cpp: In function 'int main()':
strange_device.cpp:27:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   27 |   scanf("%d%lld%lld", &n, &A, &B);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
strange_device.cpp:38:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   38 |     scanf("%lld%lld", &l, &r);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~
#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...