现在给你一个由 nn 个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?
输入格式
输入包含多组测试数据。每组输入第一行是一个正整数 nn(n<500000n<500000),表示序列的长度,当 n=0n=0 时。
接下来的 nn 行,每行一个整数 a_ia
i
(0 \le a_i \le 9999999990≤a
i
≤999999999),表示序列中第 ii 个元素。
输出格式
对于每组输入,输出使得所给序列升序的最少交换次数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
5
9 1 0 5 4
3
1 2 3
0
样例输出复制
6
0
//@author:hairu,wu
//@from:ahut
#include<iostream>
using namespace std;
typedef long long ll;
const int max_n=500050;
int x[max_n];
int b[max_n];//临时变量
ll num;
//归并排序
void Merge(int data[],int low,int mid,int high){
int i=low,j=mid+1,k=low;
while(i<=mid && j<=high){
if(data[i]<=data[j]){
b[k++]=data[i++];
}else{
num+=j-k;//交换相邻的数字,所以也就是需要从j交换到k位置,所以需要j-k此
b[k++] = data[j++];
}
}
//处理剩余元素
while(i<=mid){
b[k++]=data[i++];
}
while(j<=high){
b[k++]=data[j++];
}
//重新将值复制进去
for(i=low;i<=high;i++){
data[i]=b[i];//
}
}
void MergeSort(int data[],int low,int high){
if(low<high){
int mid=(low+high)/2;
MergeSort(data,low,mid);
MergeSort(data,mid+1,high);
Merge(data,low,mid,high);
}
}
int main(){
int n;
while(cin >> n){
if(n==0) break;
for(int i=0;i<n;i++){
cin >> x[i];
}
num=0;
//归并排序,数组,起始点,结束点
MergeSort(x,0,n-1);
cout<<num<<endl;
}
return 0;
}