Kaidul

Jamy

Feb 1st, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX 100000
  6. int arr[MAX + 1];
  7.  
  8. long long merge(int left, int mid, int right) {
  9.     size_t m = mid - left + 1;
  10.     size_t n = right - mid;
  11.     int L[m], R[n];
  12.     for(int i = left; i <= mid; ++i) L[i - left] = arr[i];
  13.     for(int i = mid + 1; i <= right; ++i) R[i - mid - 1] = arr[i];
  14.  
  15.     int i = 0, j = 0, k = left;
  16.     long long inversion = 0;
  17.     while(i < m and j < n) {
  18.         if(L[i] > R[j]) {
  19.             inversion += m - i;
  20.             arr[k++] = R[j++];
  21.         } else {
  22.             arr[k++] = L[i++];
  23.         }
  24.     }
  25.     int l = i;
  26.     while(i < m) {
  27.         arr[k++] = L[i++];
  28.     }
  29.     while(j < n) {
  30.         arr[k++] = R[j++];
  31.     }
  32.     return inversion;
  33. }
  34.  
  35. long long mergeSort(int left, int right) {
  36.     long long inversion = 0;
  37.     if(left < right) {
  38.         int mid = left + (right - left) / 2;
  39.         inversion = mergeSort(left, mid);
  40.         inversion += mergeSort(mid + 1, right);
  41.         inversion += merge(left, mid, right);
  42.     }
  43.     return inversion;
  44. }
  45.  
  46. int main(void) {
  47.     freopen("input.txt", "r", stdin);
  48.     int value;
  49.     int indx = 0;
  50.     while(scanf("%d", &value) != EOF) {
  51.         arr[indx++] = value;
  52.     }
  53.     cout << mergeSort(0, MAX - 1);
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment