Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- // Функция слияния двух отсортированных частей массива с подсчётом инверсий.
- long long mergeAndCount(vector<int>& arr, int left, int mid, int right) {
- int i = left, j = mid;
- vector<int> temp;
- long long invCount = 0;
- // Сливаем два отсортированных массива
- while (i < mid && j < right) {
- if (arr[i] <= arr[j]) {
- temp.push_back(arr[i]);
- i++;
- } else {
- // Если arr[i] > arr[j], то все элементы arr[i...mid-1] больше arr[j]
- invCount += (mid - i);
- temp.push_back(arr[j]);
- j++;
- }
- }
- while (i < mid) {
- temp.push_back(arr[i]);
- i++;
- }
- while (j < right) {
- temp.push_back(arr[j]);
- j++;
- }
- // Копируем отсортированную последовательность обратно в arr.
- for (int k = left; k < right; k++) {
- arr[k] = temp[k - left];
- }
- return invCount;
- }
- // Рекурсивная функция Merge Sort с подсчётом инверсий.
- long long mergeSortAndCount(vector<int>& arr, int left, int right) {
- if (right - left <= 1)
- return 0;
- int mid = left + (right - left) / 2;
- long long invCount = 0;
- invCount += mergeSortAndCount(arr, left, mid);
- invCount += mergeSortAndCount(arr, mid, right);
- invCount += mergeAndCount(arr, left, mid, right);
- return invCount;
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- vector<int> arr;
- int num;
- // Считываем элементы массива из стандартного ввода.
- while (cin >> num) {
- arr.push_back(num);
- }
- long long inversions = mergeSortAndCount(arr, 0, arr.size());
- cout << inversions << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement