求逆序对
思路:一边归并排序,一边在排序一部分时如果出现当前左有序序列的当前元素比右边大,就把当前左有序序列的元素数量加入total,输出即可。
注意点:total较大,需用long long。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[100001],c[100001],i;
long long total;
void mergesort(int left,int right){
int x=right-left;
if(!x)return;
int mid=(left+right)/2;
mergesort(left,mid);
int m=mid;
mid++;
mergesort(mid,right);
int cnt=left,l=left;
while(left<=m&&mid<=right){
if(a[left]<=a[mid]){
c[cnt]=a[left];
left++;
}
else{
c[cnt]=a[mid];
total+=m-left+1;
mid++;
}
cnt++;
}
while(left<=m){
c[cnt]=a[left];
left++;
cnt++;
}
while(mid<=right){
c[cnt]=a[mid];
mid++;
cnt++;
}
for(i=l;i<=right;i++)
a[i]=c[i];
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
mergesort(1,n);
printf("%lld",total);
return 0;
}