1.题目链接
点这里
2.思路
题意:求序列逆序对的数量。
利用归并排序中合并两个子序列的过程来统计逆序对数量。
3.代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=5e5+10;
typedef long long LL;
int n;
LL s[MAXN],tmp[MAXN],cnt;
void merge_sort(int l,int r)
{
if(l>=r)
return;
int mid=l+r>>1;
merge_sort(l,mid),merge_sort(mid+1,r);
int k=0;
int i=l,j=mid+1;
while(i<=mid&&j<=r){
if(s[i]<=s[j])
tmp[k++]=s[i++];
else{
tmp[k++]=s[j++];
cnt+=mid-i+1;//从i开始到mid-1都与mid构成逆序对
}
}
while(i<=mid) tmp[k++]=s[i++];
while(j<=r) tmp[k++]=s[j++];
for(int i=l,j=0;i<=r&&j<k;i++,j++)
s[i]=tmp[j];
}
int main(void)
{
while(scanf("%d",&n)&&n){
cnt=0;
memset(s,0,sizeof(s));
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=n;i++)
cin>>s[i];
merge_sort(1,n);
cout<<cnt<<endl;
}
return 0;
}