Ultra-QuickSort poj2299 (归并排序 求逆序数对)

时间:2021-05-27 04:13:17

Ultra-QuickSort
Time Limit: 7000MS   Memory Limit: 65536K
Total Submissions: 57649   Accepted: 21298

Description

Ultra-QuickSort  poj2299 (归并排序 求逆序数对)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


///2299 MergeSort
#include <iostream>
#include <cstdio>
using namespace std;

const int maxn=500010;

int num[maxn],temp[maxn];
long long sum;

void Merge(int low,int mid,int high)
{
int i=low;
int j=mid+1;
int cnt=1; ///cnt 多加了一个

while(i<=mid && j<=high)
{
if(num[i] < num[j]) ///防止相等的时候计算逆序对
{
temp[cnt++]=num[i++];
}
else
{
temp[cnt++]=num[j++];
sum+=mid+1-i;
///左边的元素比右边的大,那么左边剩下的没比完的元素和这个右边的元素都构成了逆序对
/// 12354 5和4 比较; 逆序对就是1 12543 5和4 然后就是12453 4和3
}
}

while(i<=mid)
{
temp[cnt++]=num[i++];
}

while(j<=high)
{
temp[cnt++]=num[j++];
}

for (i=1;i<cnt;i++) /// 从low开始复制回去
{
num[low+i-1]=temp[i];
}
}

void msort(int low,int high)
{
int mid;
if (low<high)
{
mid=(low+high)/2;

msort(low,mid);
msort(mid+1,high);
Merge(low,mid,high);
}
}

int main()
{
int i,n;
while(cin>>n && n)
{
sum=0;
for(i=1; i<=n; i++)
{
scanf("%d",&num[i]);
}
msort(1,n);
printf("%lld\n",sum);
}
return 0;
}