您的位置:首页 > 产品设计 > UI/UE

POJ 2299 Ultra-QuickSort(逆序数)

2018-03-26 03:54 316 查看
                                Ultra-QuickSortDescription

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.InputThe 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.OutputFor 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 Input5
9
1
0
5
4
3
1
2
3
0
Sample Output6
0题意:给定一个数组,每次可以交换相邻两个数组的值,求最少交换次数使数组变为递增数组。题解:标准的逆序数模板。AC代码:#include <iostream>
using namespace std;
const int maxn = 500006;
int n,a[maxn],b[maxn];
long long sum;
void merge(int l,int mid,int r)
{
int i = l;
int j = mid+1;
for(int k=l;k<=r;k++)
{
if(j>r||i<=mid&&a[i]<a[j])b[k]=a[i++];
else
{
b[k]=a[j++];
sum+=mid-i+1;
}
}
for(int k=l;k<=r;k++)a[k]=b[k];
}
void update_merge(int start,int end)
{
if(start>=end)return ;
int mid = (start+end)/2;
update_merge(start,mid);
update_merge(mid+1,end);
merge(start,mid,end);
}
int main(int argc, char const *argv[])
{
while(cin>>n)
{
if(!n)break;
sum=0;
for(int i=1;i<=n;i++)cin>>a[i];
update_merge(1,n);
cout<<sum<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: