Advertisement
coloriot

HA_17_C_V3

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