题目链接:https://vjudge.net/contest/369436#problem/F
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
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
翻译:
通过交换两个相邻的元素来处理n个不同的整数序列,直到序列按升序排序。问最少需要多少次操作?
归并排序思想:
假设初始序列含有n个记录,首先将这n个记录看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5*1e5+10;
typedef long long LL;
LL a[N],res,r[N];
void Merge(int low,int mid,int high)
{
int i,j,k;
i=low,j=mid+1,k=low;
while((i<=mid)&&(j<=high))
{
if(a[i]<=a[j])
r[k++]=a[i++];
else
{
r[k++]=a[j++];
res+=j-k;
}
}
while(i<=mid)///其中一个没用完
r[k++]=a[i++];
while(j<=high)
r[k++]=a[j++];
for(int i=low; i<=high; i++)
a[i]=r[i];
}
void Mergesort(int low,int high)
{
int mid;
if(low==high)
return;
else
{
mid=(low+high)/2;
Mergesort(low,mid);///左部分,右部分
Mergesort(mid+1,high);
Merge(low,mid,high);
}
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
for(int i=0; i<n; i++)
scanf("%lld",&a[i]);
res=0;
Mergesort(0,n-1);///对数组a做归并排序
printf("%I64d\n",res);
}
return 0;
}