1311:【例2.5】求逆序对
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6093 通过数: 1270
【题目描述】
给定一个序列a1,a2,…,ana1,a2,…,an,如果存在i<ji<j并且ai>ajai>aj,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为nn,表示序列长度,接下来的nn行,第i+1i+1行表示序列中的第ii个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤105,Ai≤105N≤105,Ai≤105。
#include<bits/stdc++.h>
using namespace std;
long long a[100001],r[100001];
long long n,ans;
void asort(long long begin,long long end)
{
if(begin==end)
return;
long long mid=(begin+end)/2;
asort(begin,mid);
asort(mid+1,end);
long long x=mid+1,y=begin,z=begin;
while(x<=end&&y<=mid)
if(a[x]<a[y])
{
ans+=mid-y+1;
r[z++]=a[x++];
}
else
r[z++]=a[y++];
while(x<=end)
r[z++]=a[x++];
while(y<=mid)
r[z++]=a[y++];
for(long long i=begin;i<=end;i++)
a[i]=r[i];
}
int main()
{
cin>>n;
for(long long i=1;i<=n;i++)
cin>>a[i];
asort(1,n);
cout<<ans;
return 0;
}