Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.90 KB | None | 0 0
  1. /*
  2. Given an array A: 1 6 7 5 2 4 3
  3. The task is to compute the number of inversions.
  4. */
  5.  
  6.  
  7. // Naive solution: O(nĀ²)
  8. int number_of_inversions(vector<int> A) {
  9.   int n = A.size();
  10.   int inv = 1;
  11.   for (int i = 0 ; i < n ; ++i)
  12.     for (int j = i+1 ; j < n ; ++j)
  13.        inv ^= (A[i] > A[j]);
  14.   return inv;
  15. }
  16.  
  17.  
  18.  
  19. // Optimised: O (n log n): using fenwick tree
  20.  
  21. int *tree = NULL;
  22. int n;
  23.  
  24. void update(int i, int value){
  25.   while(i<=n){
  26.     tree[i]+=value;
  27.     i+=(i&-i);
  28.   }
  29. }
  30.  
  31. int sum(int i){
  32.   int sm=0;
  33.   while(i>0){
  34.     sm+=tree[i];
  35.     i-=(i&-i);
  36.   }
  37.   return sm;
  38. }
  39.  
  40. int range_sum(int i, int j){
  41.   return sum(j)-sum(i);
  42. }
  43.  
  44.  
  45. int number_of_inversions(vector<int> A) {
  46.   int n = A.size();
  47.   tree = new int[n+1];
  48.    fill_n(tree, n+1, 0);
  49.    int inv = 0;
  50.    for (int i = 0; i < n; ++i) {
  51.          inv += range_sum(A[i], n);
  52.          update(A[i], 1);
  53.    }
  54.   return inv;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement