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
为了熟悉归并排序写了这题,归并排序模仿冒泡排序的过程中,当两个数组(a、b)合并为t时,如果b数组的数字先a数组进入t数组中,那么冒泡统计的结果要加上a数组中还未进入t数组的数的个数。WA了一次,因为结果会爆int
好久没撸代码了。。。。下面代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 500010;
int save[maxn];
int temp[maxn];
long long res;
void mergeArray(int a[],int left,int mid,int right){
int i;
int p1 = left,p2 = mid+1,p = 0;
while(p1<=mid&&p2<=right){
if(a[p1]<a[p2]){
temp[p++] = a[p1++];
}else{
temp[p++] = a[p2++];
//cout<<(mid-p1+1)<<endl;
res +=(mid-p1+1);
}
}
if(p1>mid){
while(p2<=right){
temp[p++] = a[p2++];
}
}else{
while (p1<=mid) {
temp[p++] = a[p1++];
}
}
p = 0;
for(i=left;i<=right;i++){
a[i] = temp[p++];
}
}
void mergesort(int a[],int left,int right){
int mid;
if(left<right){
mid = (left+right)/2;
mergesort(a, left, mid);
mergesort(a, mid+1, right);
mergeArray(a,left,mid,right);
}
}
int main(){
int n,i,j,k;
while(~scanf("%d",&n)&&n){
res = 0;
for(i=1;i<=n;i++){
scanf("%d",&save[i]);
}
mergesort(save, 1, n);
/*for(i=1;i<=n;i++){
printf("%d ",save[i]);
}
printf("\n");
*/
printf("%lld\n",res);
}
return 0;
}