1311:【例2.5】求逆序对
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 26125 通过数: 5883
【题目描述】
给定一个序列a1,a2,…,an,如果存在i<j 并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤10^5,Ai≤10^5。
#include <stdio.h>
#define N 100010
int a[N],r[N];
long long ans;
void msort(int s,int t)
{
int mid,i,j,k;
if(s==t) //如果只有一个数字则返回,无须排序
return;
mid=(s+t)/2;
msort(s,mid); //分解左序列
msort(mid+1,t); //分解右序列
i=s; //接下来合并
j=mid+1;
k=s;
while(i<=mid && j<=t)
{
if(a[i]<=a[j])
{
r[k]=a[i];
k++;
i++;
}
else
{
r[k]=a[j];
k++;
j++;
ans+=mid-i+1; //统计产生逆序对的数量
}
}
while(i<=mid) //复制左边子序列剩余
{
r[k]=a[i];
k++;
i++;
}
while(j<=t) //复制右边子序列剩余
{
r[k]=a[j];
k++;
j++;
}
for(i=s;i<=t;i++)
a[i]=r[i];
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
msort(1,n);
printf("%lld\n",ans);
return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1311