Untitled
unknown
plain_text
2 years ago
1.6 kB
7
Indexable
#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;
}Editor is loading...
Leave a Comment