Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Дана последовательность целых чисел из диапазона (-10^9 .. 10^9). Длина последовательности не больше 10^6. Числа записаны по одному в строке. Количество чисел не указано.
- Пусть количество элементов n, и числа записаны в массиве a = a[i]: i из [0..n-1].
- Требуется напечатать количество таких пар индексов (i,j) из [0..n-1], что (i < j и a[i] > a[j]).
- */
- #include <iostream>
- void Merge(int* arr , int Start ,int meddle, int Finish , long long &sum)
- {
- int i = Start;
- int j = meddle + 1;
- int arrnew[Finish - Start + 1];
- while(i <= meddle && j <= Finish)
- {
- if(arr[i] <= arr[j])
- {
- arrnew[i + j - Start -meddle - 1] = arr[i];
- ++i;
- }
- else
- {
- arrnew[i + j - Start - meddle - 1] = arr[j];
- ++j;
- sum += meddle - i + 1; // прибавяляем все инверсии для arr[y]
- }
- }
- if(i == meddle + 1)
- {
- for(;j <= Finish; ++j)
- {
- arrnew[i + j - Start - meddle - 1] = arr[j];
- }
- }
- else
- {
- for(;i <= meddle; ++i)
- {
- arrnew[i + j - Start - meddle - 1] = arr[i];
- }
- }
- for(int k = 0; k < Finish - Start + 1; ++k)
- {
- arr[Start + k] = arrnew[k];
- }
- }
- void Sort(long long &sum, int* a , int start , int finish)
- {
- if(abs(finish - start) == 0)
- {
- return;
- }
- else
- {
- int meddle = (start + finish) / 2;
- Sort(sum , a , start , meddle);
- Sort(sum , a , meddle + 1, finish);
- Merge(a , start , meddle, finish, sum);
- }
- }
- int main()
- {
- int i = 0;
- int k;
- int A[1000000];
- while(std::cin >> k)
- {
- A[i] = k;
- ++i;
- }
- long long sum = 0; //количество инверсий
- Sort(sum , A , 0 , i - 1);
- std::cout << sum << '\n';
- std::cout << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement