Advertisement
JosepRivaille

P80595: How many inversions?

Mar 24th, 2016
1,126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5.  
  6. int merge(vector<int>& v, int l, int m, int r)
  7. //Return inversions and merged vector v[l..r] = v[l..m] ~ v[m+1..r]
  8. {
  9.     vector<int> z(r-l+1);
  10.     int i = l;
  11.     int j = m+1;
  12.     int k = 0;
  13.     int count = 0;
  14.     while (i <= m && j <= r) {
  15.         if (v[i] <= v[j])
  16.             z[k++] = v[i++];
  17.         else {
  18.             z[k++] = v[j++];
  19.             count += m+1 - i;
  20.         }
  21.     }
  22.     while (i <= m) z[k++] = v[i++];
  23.     while (j <= r) z[k++] = v[j++];
  24.     for (k = 0; k < z.size(); ++k) v[l+k] = z[k];
  25.     return count;
  26. }
  27.  
  28. int mergesort_inv(vector<int>& v, int l, int r)
  29. //Return number of inversions of v[l..r]
  30. //Total ammount of inversions will be inversions of left vector + right vector (recursivity) + merge process inversions
  31. {
  32.     int count = 0;
  33.     if (l < r) {
  34.         int m = (l+r)/2;
  35.         count = mergesort_inv(v, l, m);
  36.         count += mergesort_inv(v, m+1, r);
  37.         count += merge(v, l, m, r);
  38.     }
  39.     return count;
  40. }
  41.  
  42. int main()
  43. {
  44.     int n;
  45.     while (cin >> n) {
  46.         vector<int> v(n);
  47.         for (int i = 0; i < n; ++i) cin >> v[i];
  48.         cout << mergesort_inv(v, 0, v.size()-1) << endl;
  49.     }
  50. }
  51.  
  52. //JosepRivaille
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement