Ultra-QuickSort
Description

Ultra-QuickSort produces the output
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0题意:给定一个数组,每次可以交换相邻两个数组的值,求最少交换次数使数组变为递增数组。
题解:标准的逆序数模板。
AC代码:
#include <iostream>
using namespace std;
const int maxn = 500006;
int n,a[maxn],b[maxn];
long long sum;
void merge(int l,int mid,int r)
{
int i = l;
int j = mid+1;
for(int k=l;k<=r;k++)
{
if(j>r||i<=mid&&a[i]<a[j])b[k]=a[i++];
else
{
b[k]=a[j++];
sum+=mid-i+1;
}
}
for(int k=l;k<=r;k++)a[k]=b[k];
}
void update_merge(int start,int end)
{
if(start>=end)return ;
int mid = (start+end)/2;
update_merge(start,mid);
update_merge(mid+1,end);
merge(start,mid,end);
}
int main(int argc, char const *argv[])
{
while(cin>>n)
{
if(!n)break;
sum=0;
for(int i=1;i<=n;i++)cin>>a[i];
update_merge(1,n);
cout<<sum<<endl;
}
return 0;
}