Advertisement
allia

инверсии

Oct 25th, 2020 (edited)
1,886
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. long long merge_series (long long *arr, long long first, long long last_1, long long last_2, long long *dubl)
  7. {
  8.   long long i = first;
  9.   long long j = last_1+1;
  10.   long long c = 0;
  11.   long long sum = 0;
  12.  
  13.  for (c = first; c <= last_2; c++)
  14.   {
  15.     if (j > last_2)
  16.     dubl[c] = arr[i++];
  17.      else if (i > last_1)
  18.       dubl[c] = arr[j++];
  19.       else if (arr[i] > arr[j])
  20.        {
  21.          dubl[c] = arr[j];
  22.          sum += last_1 - i+1;
  23.          j++;
  24.        }
  25.        else
  26.        {
  27.          dubl[c] = arr[i++];
  28.        }
  29.   }
  30.   //cout << sum << " ";
  31.   return sum;
  32. }
  33.  
  34. void sort (long long *arr, long long first, long long last, long long *dubl, long long &sum)
  35. {
  36.   int middle = (first + last)/2;
  37.   if (first < middle)
  38.    sort (arr, first, middle, dubl, sum);
  39.   if (middle + 1 < last)
  40.    sort (arr, middle+1, last, dubl, sum);
  41.  
  42.   sum += merge_series (arr, first, middle, last, dubl);
  43.   //cout << sum << endl;
  44.  
  45.   for (int i = first; i <= last; i++)  
  46.     arr[i] = dubl[i];
  47.  }
  48.  
  49. int main()
  50. {
  51.   long long n=0;
  52.   cin >> n;
  53.   long long sum = 0;
  54.  
  55.   long long *arr = new long long[n];
  56.   for (long long i=0; i<n; i++)
  57.    cin >> arr[i];
  58.  
  59.   long long *dubl = new long long[n];
  60.  
  61.   sort (arr, 0, n-1, dubl, sum);
  62.   cout << sum << endl;
  63.  
  64.   //for (int i=0; i < n; i++) cout << arr[i] << " ";
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement