1311:【例2.5】求逆序对
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 61497 通过数: 14704
【题目描述】
给定一个序列a1,a2,…,an�1,�2,…,��,如果存在i<j�<�并且ai>aj��>��,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n�,表示序列长度,接下来的n�行,第i+1�+1行表示序列中的第i�个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤10^5,Ai≤10^5。
用二分的归并排序来求出交换了几次(有几对逆序数)
#include<bits/stdc++.h>
using namespace std;
int n,a[100001],x1[100001];
long long cnt;
void msort(int x[],int l,int r)
{
if(l>=r)
{
return;
}
int l1=l,mid=(l+r)/2,r1=mid+1,x2=l;
msort(x,l,mid);
msort(x,mid+1,r);
while(l1<=mid&&r1<=r)
{
if(x[l1]<=x[r1])
{
x1[x2++]=x[l1++];
}
else
{
cnt+=mid-l1+1;
x1[x2++]=x[r1++];
}
}
while(l1<=mid)
{
x1[x2++]=x[l1++];
}
while(r1<=r)
{
x1[x2++]=x[r1++];
}
for(int i=l;i<=r;++i)
{
x[i]=x1[i];
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
msort(a,1,n);
cout<<cnt;
}