逆序对定义:对于给定的一段正整数序列,逆序对就是序列中 ai>aj, 且 i<j 的有序对
求一列数有多少对逆序对
例题:
P1908 逆序对
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=500010;
int n,a[N],tmp[N];
long long ans=0;
void msort(int l,int r)
{
if(l>=r) return;
int mid=(l+r)>>1;
msort(l,mid);
msort(mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) tmp[k++]=a[i++];
else{
tmp[k++]=a[j++];
ans+=mid-i+1;//**************************
//逆序对数量 因为左面的数字一旦大于一个数 那么排在左面后面(左半区)的数字也大于那个数 并不是ans++
}
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
msort(1,n);
cout<<ans;
return 0;
}