Advertisement
Guest User

NikolaevMisha/4.3/new

a guest
Oct 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. /*
  2. Дана последовательность целых чисел из диапазона (-10^9 .. 10^9). Длина последовательности не больше 10^6. Числа записаны по одному в строке. Количество чисел не указано.
  3. Пусть количество элементов n, и числа записаны в массиве a = a[i]: i из [0..n-1].
  4. Требуется напечатать количество таких пар индексов (i,j) из [0..n-1], что (i < j и a[i] > a[j]).
  5.  
  6. */
  7.  
  8. #include <iostream>
  9.  
  10. void Merge(int* arr , int Start ,int meddle, int Finish , long long &sum)
  11. {
  12.     int i = Start;
  13.     int j = meddle + 1;
  14.     int arrnew[Finish - Start + 1];
  15.     while(i <= meddle && j <= Finish)
  16.     {
  17.         if(arr[i] <= arr[j])
  18.         {
  19.  
  20.            arrnew[i + j - Start -meddle - 1] = arr[i];
  21.            ++i;
  22.         }
  23.         else
  24.         {
  25.             arrnew[i + j - Start - meddle - 1] = arr[j];
  26.             ++j;
  27.             sum += meddle - i + 1; // прибавяляем все инверсии для arr[y]
  28.         }
  29.     }
  30.     if(i == meddle + 1)
  31.     {
  32.         for(;j <= Finish; ++j)
  33.         {
  34.             arrnew[i + j - Start - meddle - 1] = arr[j];
  35.         }
  36.     }
  37.     else
  38.     {
  39.         for(;i <= meddle; ++i)
  40.         {
  41.             arrnew[i + j - Start - meddle - 1] = arr[i];
  42.         }
  43.     }
  44.     for(int k = 0; k < Finish - Start + 1; ++k)
  45.     {
  46.         arr[Start + k] = arrnew[k];
  47.     }
  48. }
  49.  
  50. void Sort(long long &sum, int* a , int start , int finish)
  51. {
  52.     if(abs(finish - start) == 0)
  53.     {
  54.         return;
  55.     }
  56.     else
  57.     {
  58.         int meddle = (start + finish) / 2;
  59.  
  60.         Sort(sum , a , start , meddle);
  61.         Sort(sum , a , meddle + 1, finish);
  62.         Merge(a , start , meddle, finish, sum);
  63.     }
  64.  
  65. }
  66.  
  67.  
  68. int main()
  69. {
  70.     int i = 0;
  71.     int k;
  72.     int A[1000000];
  73.     while(std::cin >> k)
  74.     {
  75.        A[i] = k;
  76.        ++i;
  77.     }
  78.     long long sum = 0; //количество инверсий
  79.     Sort(sum , A , 0 , i - 1);
  80.     std::cout << sum << '\n';
  81.     std::cout << '\n';
  82.  
  83.     return 0;
  84.  
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement