POJ 2299 Ultra-QuickSort

原创 2015年11月21日 19:52:04
Ultra-QuickSort
Time Limit: 7000MS   Memory Limit: 65536K
Total Submissions: 50447   Accepted: 18499

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 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

Source


思路:直接写一个归并排序求逆序数的模板就行了,不过这里要注意,使用int会溢出

ac代码

#include <iostream>
using namespace std;

const int maxn=500000+5;
long long  ans=0;
long long  a[maxn],t[maxn];
void mergesort(int x,int y){

    if(x==y) return ;

    else {
        int mid=(x+y)/2;

        int mm=mid+1,xx=x,i=x;
        mergesort(x,mid);
        mergesort(mid+1,y);

        while(xx<=mid && mm<=y){

            if(a[xx]<=a[mm]) t[i++]=a[xx++];
            else {
                ans+=mid-xx+1;
                t[i++]=a[mm++];
            }
        }

        while(xx<=mid) t[i++]=a[xx++];
        while(mm<=y)  t[i++]=a[mm++];

         for(int i=x;i<=y;i++){
            a[i]=t[i];
        }
    }

}
int  main(){

    int n;
    while(cin>>n &&n){

        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        ans=0;
        mergesort(0,n-1);
        cout<<ans<<endl;
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

Ultra-QuickSort POJ - 2299 (树状数组)

Ultra-QuickSort  POJ - 2299  树状数组模板题。 思路:看此篇博文之前,你要对树状数组有所了解,这里树状数组求的也是和,并且因为更新多次,所以不用树状数组减少复杂度的话 ...
  • duan_1998
  • duan_1998
  • 2017年02月22日 21:29
  • 332

POJ 2299 Ultra-QuickSort (树状数组)

前段时间用归并排序写了这题,发现树状数组也能解这题,就去学习了一下 首先先来看一个序列   6 1 2 7 3 4 8 5,此序列的逆序数为5+3+1=9。冒泡法可以直接枚举出逆序数,但是时间复杂度...
  • wdkirchhoff
  • wdkirchhoff
  • 2014年12月09日 22:16
  • 1492

【Poj】-2299-Ultra-QuickSort(树状数组,离散化, 好)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 55721 ...
  • Bear1998
  • Bear1998
  • 2016年08月19日 16:03
  • 200

poj 2299 Ultra-QuickSort 求逆序数,树状数组解法,详细解析

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque...
  • Lionel_D
  • Lionel_D
  • 2015年02月05日 20:55
  • 1094

poj - 2299 - Ultra-QuickSort(树状数组)

题意:求长度为n(n 题目链接:http://poj.org/problem?id=2299 ——>>设x[i]表示数i已经出现的次数,从后往前扫描,对于每个数k,那么k产生的逆序对数为x[0]...
  • SCNU_Jiechao
  • SCNU_Jiechao
  • 2014年01月25日 11:51
  • 818

树状数组例题(poj2299)

传送门: 树状数组,具体的说是 离散化+树状数组。这也是学习树状数组的第一题. 算法的大体流程就是: 1.先对输入的数组离散化,使得各个元素比较接近,而不是离散的, 2.接着,运用树状数组的标准操作来...
  • guhaiteng
  • guhaiteng
  • 2016年08月06日 22:07
  • 1403

Poj 2299 Ultra-QuickSort【逆序数】

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 51736 ...
  • liuke19950717
  • liuke19950717
  • 2016年03月02日 16:31
  • 180

POJ 2299 Ultra-QuickSort

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 45088 ...
  • sunnykema
  • sunnykema
  • 2015年03月04日 21:43
  • 165

poj 2299 Ultra-QuickSort 题解

Description In this problem, you have to analyze a particular sorting algorithm. The algorithm pro...
  • u013724185
  • u013724185
  • 2014年02月22日 13:23
  • 824

POJ 2299 Ultra-QuickSort

Ultra-QuickSort Description In this problem, you have to analyze a particular sorting algorithm. T...
  • u014688855
  • u014688855
  • 2014年07月15日 16:32
  • 593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2299 Ultra-QuickSort
举报原因:
原因补充:

(最多只允许输入30个字)