#include<cstdio>using namespace std;int a[100001],r[100001],n,i;long long sum=0;void mergesort(int s,int m,int t){int l,j,k;if (s==t)return;i=s;j=m+1;k=s;while (i<=m && j<=t)if (a[i]<=a[j]){r[k]=a[i];i++;k++;}else{r[k]=a[j];j++;k++;sum+=m-i+1;}while (i<=m){r[k]=a[i];i++;k++;}while (j<=t){r[k]=a[j];j++;k++;}for (i=s;i<=t;i++)a[i]=r[i];}void merge(int l,int r){int m=(l+r)/2;if (l<r){merge(l,m);merge(m+1,r);mergesort(l,m,r);}}int main(){scanf("%d",&n);for (i=1;i<=n;i++)scanf("%d",&a[i]);merge(1,n);printf("%lld",sum);return 0;}
归并排序求逆序对
最新推荐文章于 2025-03-22 18:50:42 发布