Advertisement
svetlai

Songs

Nov 13th, 2015
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.17 KB | None | 0 0
  1. using System.ComponentModel;
  2.  
  3. namespace Songs
  4. {
  5.     using System;
  6.     using System.Collections.Generic;
  7.     using System.Linq;
  8.     using System.Text;
  9.     using System.Threading.Tasks;
  10.  
  11.     public class Program
  12.     {
  13.         public static void Main()
  14.         {
  15.             int n = int.Parse(Console.ReadLine());
  16.  
  17.             var first = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
  18.             var second = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
  19.  
  20.             var rename = new int[n + 1];
  21.             for (int i = 0; i < n; i++)
  22.             {
  23.                 rename[first[i]] = i;
  24.             }
  25.  
  26.             for (int i = 0; i < n; i++)
  27.             {
  28.                 second[i] = rename[second[i]];
  29.             }
  30.  
  31.             Console.WriteLine(CountInversions(second, 0, n));
  32.         }
  33.  
  34.         private static long CountInversions(int[] array, int left, int right)
  35.         {
  36.             if (left + 1 == right)
  37.             {
  38.                 return 0;
  39.             }
  40.  
  41.             int middle = (left + right)/2;
  42.  
  43.             long inversions = CountInversions(array, left, middle) + CountInversions(array, middle, right);
  44.  
  45.             int[] sorted = new int[right - left];
  46.             int i = left;
  47.             int j = middle;
  48.             int k = 0;
  49.  
  50.             while (i < middle && j < right)
  51.             {
  52.                 if (array[i] < array[j])
  53.                 {
  54.                     sorted[k] = array[i];
  55.                     i++;
  56.                 }
  57.                 else
  58.                 {
  59.                     inversions += (middle - i);
  60.                     sorted[k] = array[j];
  61.                     j++;
  62.                 }
  63.  
  64.                 k++;
  65.             }
  66.  
  67.             while (i < middle)
  68.             {
  69.                 sorted[k] = array[i];
  70.                 i++;
  71.                 k++;
  72.             }
  73.  
  74.             while (j < right)
  75.             {
  76.                 sorted[k] = array[j];
  77.                 j++;
  78.                 k++;
  79.             }
  80.  
  81.             for (k = 0; k < sorted.Length; k++)
  82.             {
  83.                 array[left + k] = sorted[k];
  84.             }
  85.  
  86.             return inversions;
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement