poj 2299 Ultra-QuickSort


Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 56054 Accepted: 20706

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

Waterloo local 2005.02.05
/*
数据结构好神奇!!!
树状数组:将每个下标用二进制表示末尾有k个连续0,那么这个坐标盛放的数值就是2^k个数的和,就是从这个数往前数2^k的和。
这个题先把数据离散化,所谓离散化呐,我现在的理解就是数据处理一下,使得内存占用小一点,对数列优化一下。
这个题的优化就是对数据先进行排序,知道大小关系之后就不需要管这些数据了,然后在树中找每个数前面有多少比他小的数然后求和。
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#define N 500010
using namespace std;
struct node 
{
    long long val;
    long long ip;
}fr[N];
bool comp(node a,node b)
{
    return a.val<b.val;
}
long long n;
long long c[N];//记录每个节点的和
long long index[N];//记录每个节点的和的下标
long long lowbit(long long x)
{
    return x&(-x);
}
long long getx(long long x)
{
    long long ans=0;
    while(x>=1)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
void update(long long x)
{
    while(x<=n)
    {
        c[x]+=1;
        x+=lowbit(x);
    }
}
int main()
{   
    //freopen("in.txt","r",stdin);
    while(scanf("%lld",&n)!=EOF&&n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&fr[i].val);
            fr[i].ip=i;
        }    
        sort(fr+1,fr+n+1,comp);
        for(int i=1;i<=n;i++)
            index[fr[i].ip]=i;
        for(int i=1;i<=n;i++) c[i]=0;
        long long cur=0;
        for(int i=1;i<=n;i++)
        {
            update(index[i]);
            //cout<<getx(index[i])<<" ";
            cur+=(i-getx(index[i]));
        }    
        //cout<<endl;
        printf("%lld\n",cur);
    }
    return 0;
}
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         I have a dream!A AC deram!!
 orz orz orz orz orz orz orz orz orz orz orz
 orz orz orz orz orz orz orz orz orz orz orz
 orz orz orz orz orz orz orz orz orz orz orz

*/

优质内容筛选与推荐>>
1、sva学习笔记
2、python笔记-14 html
3、将eclipse的应用程序打包成.exe
4、C++ 之 转义字符
5、机器学习基石1-概述


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn