快速排序模板题,要注意结果会超过Int, 要使用long long。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int a[100005];
ll cnt = 0;
void Merge(int l1, int r1, int l2, int r2) {
int temp[100005], begin=l1, i=0;
while (l1<=r1&&l2<=r2) {
if (a[l1]<=a[l2]) {
temp[i++] = a[l1++];
} else {
temp[i++] = a[l2++];
cnt+=r1-l1+1;
}
}
while (l1<=r1) temp[i++] = a[l1++];
while (l2<=r2) temp[i++] = a[l2++];
for (int j=0;j<i;j++) {
a[begin+j] = temp[j];
}
}
void find_inv_num(int l, int r) {
if (l==r) return ;
int mid = (l+r)/2;
find_inv_num(l, mid);
find_inv_num(mid+1, r);
Merge(l, mid, mid+1, r);
}
int main() {
int n;
cin>>n;
for (int i=1;i<=n;i++) {
cin>>a[i];
}
find_inv_num(1, n);
cout<<cnt;
return 0;
}

京公网安备 11010502036488号