Advertisement
coloriot

HA18_O(N)

Aug 6th, 2024
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void swap(int &a, int &b) {
  6.     int temp = a;
  7.     a = b;
  8.     b = temp;
  9. }
  10.  
  11. void sift_down(int* heap, int size, int index) {
  12.     while (2 * index + 1 < size) {
  13.         int j = 2 * index + 1;
  14.         if (j + 1 < size && heap[j] < heap[j + 1]) j++;
  15.         if (heap[index] >= heap[j]) break;
  16.         swap(heap[index], heap[j]);
  17.         index = j;
  18.     }
  19. }
  20.  
  21. void build_heap(int* array, int size) {
  22.     for (int i = size / 2 - 1; i >= 0; --i) {
  23.         sift_down(array, size, i);
  24.     }
  25. }
  26.  
  27. void heap_sort(int* array, int size) {
  28.     build_heap(array, size);
  29.     for (int i = size - 1; i > 0; --i) {
  30.         swap(array[0], array[i]);
  31.         sift_down(array, i, 0);
  32.     }
  33. }
  34.  
  35. int main() {
  36.     int N;
  37.     cin >> N;
  38.  
  39.     int* a = new int[N];
  40.     int* b = new int[N];
  41.  
  42.     for (int i = 0; i < N; ++i) {
  43.         cin >> a[i] >> b[i];
  44.     }
  45.  
  46.     heap_sort(a, N);
  47.     heap_sort(b, N);
  48.  
  49.     int nonIntersectingCount = 0;
  50.     int maxEnd = b[0]; // Теперь вместо нуля храним первое значение массива
  51.  
  52.     // Проход по массиву начала отрезков
  53.     for (int i = 0; i < N; ++i) {
  54.         // Проверяем текущее начало отрезка
  55.         if (a[i] > maxEnd) {
  56.             nonIntersectingCount++;
  57.         }
  58.         // Обновляем максимальное значение конца отрезка
  59.         maxEnd = max(maxEnd, b[i]);
  60.     }
  61.  
  62.     cout << nonIntersectingCount << endl;
  63.  
  64.     delete[] a;
  65.     delete[] b;
  66.  
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement