Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.78 KB | None | 0 0
  1. using System;
  2.  
  3. class Solution
  4. {
  5.     static long countInversions(int[] arr)
  6.     {
  7.         var inversionsCount = 0L;
  8.  
  9.         MergeSort(arr, 0, arr.Length - 1, ref inversionsCount);
  10.  
  11.         return inversionsCount;
  12.     }
  13.  
  14.     static void MergeSort(int[] arr, int l, int r, ref long inversionsCount)
  15.     {
  16.         if (l < r)
  17.         {
  18.             var m = l + (r - l) / 2;
  19.             MergeSort(arr, l, m, ref inversionsCount);
  20.             MergeSort(arr, m + 1, r, ref inversionsCount);
  21.  
  22.             Merge(arr, l, m, r, ref inversionsCount);
  23.         }
  24.     }
  25.  
  26.     static void Merge(int[] arr, int l, int m, int r, ref long inversionsCount)
  27.     {
  28.         var lSize = m - l + 1;
  29.         var rSize = r - m;
  30.         var lArr = new int[lSize];
  31.         var rArr = new int[rSize];
  32.  
  33.         Array.Copy(arr, l, lArr, 0, lSize);
  34.         Array.Copy(arr, m + 1, rArr, 0, rSize);
  35.  
  36.         int i = 0, j = 0, k = 0;
  37.  
  38.         while (i < lSize && j < rSize)
  39.         {
  40.             if (lArr[i] <= rArr[j])
  41.             {
  42.                 arr[l + k++] = lArr[i++];
  43.             }
  44.             else
  45.             {
  46.                 inversionsCount += lSize + j - k;
  47.                 arr[l + k++] = rArr[j++];
  48.             }
  49.         }
  50.  
  51.         while (i < lSize)
  52.             arr[l + k++] = lArr[i++];
  53.         while (j < rSize)
  54.             arr[l + k++] = rArr[j++];
  55.     }
  56.  
  57.     static void Main(string[] args)
  58.     {
  59.         int t = Convert.ToInt32(Console.ReadLine());
  60.         for (int tItr = 0; tItr < t; tItr++)
  61.         {
  62.             int n = Convert.ToInt32(Console.ReadLine());
  63.  
  64.             int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), arrTemp => Convert.ToInt32(arrTemp));
  65.             long result = countInversions(arr);
  66.  
  67.             Console.WriteLine(result);
  68.         }
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement