题目描述】
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
#include<bits/stdc++.h>
using namespace std;
int a[100001],r[100001];
int n,ans;
void asort(int begin,int end){//归并排序
if(begin==end){
return;
}
int mid=(begin+end)/2;
asort(begin,mid);
asort(mid+1,end);
int 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(int 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;
}