#include <iostream>
using namespace std;
int a[100001];
int ta[100001];
long long int ans = 0;
void merge(int left, int right, int middle) {
int i, j, index1, index2;
for (j = left; j <= right; ++j)
ta[j] = a[j];
index1 = left;
index2 = middle + 1;
i = left;
while (index1 <= middle && index2 <= right) {
if (ta[index1] >= ta[index2]) {
a[i] = ta[index1];
++i;
++index1;
} else {
a[i] = ta[index2];
ans += middle - index1 + 1; // 这个右子列元素超过了左子列中剩余的元素
++i;
++index2;
}
}
while (index1 <= middle) {
a[i] = ta[index1];
++i;
++index1;
}
while (index2 <= right) {
a[i] = ta[index2];
++i;
++index2;
}
}
void mergesort(int left, int right) {
int middle;
if (left < right) {
middle = (left + right) / 2;
mergesort(left, middle);
mergesort(middle + 1, right);
merge(left, right, middle);
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
mergesort(0, n - 1);
cout << ans;
// system("pause");
return 0;
}
freda的越野跑c++
最新推荐文章于 2024-12-01 16:26:07 发布
2万+

被折叠的 条评论
为什么被折叠?



