Untitled
#include <iostream> #include <vector> using namespace std; long long merge(std::vector<int>& a, int start, int mid, int end) { int n1 = mid - start + 1; int n2 = end - mid; std::vector<int> left(n1), right(n2); for (int i = 0; i < n1; i++) { left[i] = a[start + i]; } for (int j = 0; j < n2; j++) { right[j] = a[mid + 1 + j]; } int i = 0, j = 0, k = start; long long inversions = 0; while (i < n1 && j < n2) { if (left[i] <= right[j]) { a[k] = left[i]; i++; } else { a[k] = right[j]; j++; inversions += n1 - i; } k++; } while (i < n1) { a[k] = left[i]; i++; k++; } while (j < n2) { a[k] = right[j]; j++; k++; } return inversions; } long long mergeSort(std::vector<int>& a, int start, int end) { long long inversions = 0; if (start < end) { int mid = start + (end - start) / 2; inversions += mergeSort(a, start, mid); inversions += mergeSort(a, mid + 1, end); inversions += merge(a, start, mid, end); } return inversions; } int main() { int n; cin >> n; vector<int> a; for(int i=0;i<n;i++){ int k; cin >> k; a.push_back(k); } long long result = mergeSort(a, 0, a.size() - 1); std::cout << result << std::endl; return 0; }
Leave a Comment