JuliaMelkozerova

HW3C

Mar 21st, 2020
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. long int merge(vector <int> & A, int low, int high) {
  7.    
  8.     int mid = (low + high) / 2;
  9.    
  10.     int Al_size = mid - low + 1;
  11.     vector <int> Al(Al_size);
  12.     for (int i = 0; i < Al_size; i++) {
  13.         Al[i] = A[i + low];
  14.     }    
  15.    
  16.     int Ar_size = high - mid;
  17.     vector <int> Ar(Ar_size);
  18.     for (int i = 0; i < Ar_size; i++) {
  19.         Ar[i] = A[i + mid + 1];
  20.     }
  21.    
  22.     int i = 0, j = 0, k;
  23.     long int count = 0;
  24.     for (k = low; k <= high; ) {
  25.         if (Al[i] <= Ar[j]) {
  26.             A[k] = Al[i];
  27.             i++;
  28.             k++;
  29.             if (i >= Al_size)   break;
  30.         }
  31.         else {
  32.             A[k] = Ar[j];
  33.             k++;
  34.             j++;
  35.             count += Al_size - i;
  36.             if (j >= Ar_size)  break;
  37.         }
  38.     }
  39.  
  40.     while (i < Al_size) {
  41.         A[k] = Al[i];
  42.         k++;
  43.         i++;
  44.     }
  45.    
  46.     while (j < Ar_size) {
  47.         A[k] = Ar[j];
  48.         k++;
  49.         j++;
  50.     }
  51.  
  52.     return count;
  53. }
  54.  
  55. long int Inversion (vector <int> & A, int low, int high) {
  56.     long int count = 0;
  57.     if (low < high) {
  58.  
  59.         int mid = (low + high) / 2;
  60.  
  61.         count += Inversion(A, low, mid);
  62.         count += Inversion(A, mid + 1, high);
  63.  
  64.         count += merge(A, low, high);
  65.     }
  66.     return count;
  67. }
  68.  
  69. int main() {
  70.     int N;
  71.     cin >> N;
  72.     vector <int> A (N);
  73.    
  74.     for (int i = 0; i < N; i++)
  75.         cin >> A[i];
  76.    
  77.     long int count = Inversion(A, 0, N - 1);
  78.     cout << count;
  79.    
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment