Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 57649 | Accepted: 21298 |
Description
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 sequenceUltra-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
///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;
}