给你一个n个数的序列,求逆序对数是多少
归并排序求逆序对数的板子:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int a[maxn],b[maxn];
ll cnt;
void merge_sort(int l,int r){
if(r-l>0){
int mid = (l+r)/2 ;
int p=l,q=mid+1;
int i=l;
merge_sort(l,mid);
merge_sort(mid+1,r);
while(p<=mid||q<=r){
if(q>r||(p<=mid&&a[p]<=a[q]))
b[i++]=a[p++];
else{
b[i++]=a[q++];
cnt+=mid-p+1;
}
}
for(i=l;i<=r;i++) a[i]=b[i];
}
}
int main(){
int n;
while(cin >> n&&n){
for(int i = 1 ; i <= n; i ++)
scanf("%d",a+i);
cnt=0;
merge_sort(1,n);
cout<<cnt<<endl;
}
return 0;
}