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.
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.
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.
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.
5 9 1 0 5 4 3 1 2 3 0
6 0
题目大意就是求逆序对,一开始是用两层for循环进行求解,结果超时,后来发现,如果后面的大于前面的,则两者进行交换,类似于归并排序。在进行归并排序时,
左右两组都已是有序队列,当后者小于前者时,前者在第i个元素位置上,则逆序数为mid - i + 1,;详细代码如下:
#include <stdio.h>
int a[500005],b[500005];
long long ans;
void Merge(int first, int mid, int last)
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
b[k++] = a[i++];
else
{
b[k++] = a[j++];
ans += (m - i + 1);
}
}
while (i <= m)
b[k++] = a[i++];
while (j <= n)
b[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = b[i];
}
void sort(int first, int last)
{
if (first < last)
{
int mid = (first + last) / 2;
sort(first, mid);
sort(mid + 1, last);
Merge(first, mid, last);
}
}
int main(){
int n;
while(~scanf("%d",&n) && n){
for(int i = 0; i < n; i ++){
scanf("%d",&a[i]);
}
ans = 0;
sort(0,n-1);
printf("%lld\n",ans);
}
return 0;
}