问题描述
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面
的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如:2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,
求该序列的逆序数。
【输入形式】
第一行,一个数 n,表示序列中有 n个数。
第二行 n 个数,表示给定的序列。序列中每个数字不超过 10的9次方。
【输出形式】
输出序列中逆序对的数目。
【样例输入】
6
5 4 2 6 3 1
【样例输出】
11
C++代码
#include <iostream>
using namespace std;
long count = 0;
int b[500100];
void CountNum(int a[],int low,int mid,int high){
int i,j,k;
i=low;
j=mid+1;
k=0;
while(i<=mid&&j<=high){
if(a[i]>a[j]){
b[k++]=a[j++];
count+=(mid-i+1);
}else{
b[k++]=a[i++];
}
}
while(i<=mid){
b[k++]=a[i++];
}
while(j<=high){
b[k++]=a[j++];
}
for(k=0,i=low;i<=high;k++,i++){
a[i]=b[k];
}
}
void Reverse(int a[], int lon, int n){
int i;
for (i=0;i+2*lon<n;i=i+2*lon){
CountNum(a,i,i+lon-1,i+2*lon-1);
}
if(i+lon-1<n){
CountNum(a,i,i+lon-1,n-1);
}
}
void ReverseNumber(int a[],int n){
for(int lon = 1; lon<n;lon = lon*2){
Reverse(a,lon,n);
}
}
int main(){
int n;
int arrayA[500100];
cin>>n;
for(int i=0;i<n;i++){
cin>>arrayA[i];
}
ReverseNumber(arrayA,n);
cout<<count<<endl;
}