#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define RG register
#define IL inline
#define pi acos(-1.0)
#define ll long long
using namespace std;
const int maxn = 500100;
int n;
long long tot;
int a[maxn],tmp[maxn];
void m_sort(int l, int r) {
if(l==r) return;
int mid=(l+r)>>1;
m_sort(l,mid),m_sort(mid+1,r);
int i=l,j=mid+1,p=l;
while(i<=mid && j<=r) {
if(a[i]>a[j]) {
tot=tot+mid-i+1;
tmp[p++]=a[j++];
}
else tmp[p++]=a[i++];
}
while(i<=mid) tmp[p++]=a[i++];
while(j<=r) tmp[p++]=a[j++];
for(int k=l; k<=r; k++) a[k]=tmp[k];
}
int main() {
freopen("逆序对.in","r",stdin);
freopen("逆序对.out","w",stdout);
while(scanf("%d", &n) && n) {
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
tot=0;
m_sort(1,n);
printf("%lld\n", tot);
}
return 0;
}
/*
1、归并排序:先保证两个子区间是有序的
2、求逆序对:如果a[j]<a[i],说明a[j]比区间[i,k]中的任何一个元素都小而位置又在j之前,所以提供了(k-i+1)对逆序对
*/
求逆序对(归并排序)
最新推荐文章于 2021-12-04 12:23:30 发布