Advertisement
coloriot

HA49

Apr 5th, 2025
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. // Функция слияния двух отсортированных частей массива с подсчётом инверсий.
  6. long long mergeAndCount(vector<int>& arr, int left, int mid, int right) {
  7.     int i = left, j = mid;
  8.     vector<int> temp;
  9.     long long invCount = 0;
  10.    
  11.     // Сливаем два отсортированных массива
  12.     while (i < mid && j < right) {
  13.         if (arr[i] <= arr[j]) {
  14.             temp.push_back(arr[i]);
  15.             i++;
  16.         } else {
  17.             // Если arr[i] > arr[j], то все элементы arr[i...mid-1] больше arr[j]
  18.             invCount += (mid - i);
  19.             temp.push_back(arr[j]);
  20.             j++;
  21.         }
  22.     }
  23.     while (i < mid) {
  24.         temp.push_back(arr[i]);
  25.         i++;
  26.     }
  27.     while (j < right) {
  28.         temp.push_back(arr[j]);
  29.         j++;
  30.     }
  31.    
  32.     // Копируем отсортированную последовательность обратно в arr.
  33.     for (int k = left; k < right; k++) {
  34.         arr[k] = temp[k - left];
  35.     }
  36.     return invCount;
  37. }
  38.  
  39. // Рекурсивная функция Merge Sort с подсчётом инверсий.
  40. long long mergeSortAndCount(vector<int>& arr, int left, int right) {
  41.     if (right - left <= 1)
  42.         return 0;
  43.    
  44.     int mid = left + (right - left) / 2;
  45.     long long invCount = 0;
  46.     invCount += mergeSortAndCount(arr, left, mid);
  47.     invCount += mergeSortAndCount(arr, mid, right);
  48.     invCount += mergeAndCount(arr, left, mid, right);
  49.     return invCount;
  50. }
  51.  
  52. int main() {
  53.     ios::sync_with_stdio(false);
  54.     cin.tie(nullptr);
  55.    
  56.     vector<int> arr;
  57.     int num;
  58.     // Считываем элементы массива из стандартного ввода.
  59.     while (cin >> num) {
  60.         arr.push_back(num);
  61.     }
  62.    
  63.     long long inversions = mergeSortAndCount(arr, 0, arr.size());
  64.     cout << inversions << "\n";
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement