zoukankan      html  css  js  c++  java
  • Poj 2299

    Ultra-QuickSort
    Time Limit: 7000MS   Memory Limit: 65536K
    Total Submissions: 52306   Accepted: 19194

    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

     
    题意:给定n个数,只能交换相邻的两个元素,至少交换几次,成为递增序列。
    题解:
    明显要求序列的逆序对数目。。。
    对于样例:
    5
    9 1 0 5 4
    我们将其排序:
    0 1 4 5 9
    在每个位置上初始放为1.
    1 1 1 1 1
    然后,从原序列开始遍历。
    先到9,我们把其排好序的位置拿出,即为5。
    然后统计位置5之前有多少1。
    1 1 1 1 1
    ————  > 4个  ans+=4
    然后把5号位置放为0。
    1 1 1 1 0
    继续操作即可。。。
    这个树状数组维护即可。。。
    注意开long long和原序列排序后要去重。。。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAXN 500010
     4 #define LL long long
     5 int n,BIT[MAXN],a[MAXN],aa[MAXN];
     6 int read()
     7 {
     8     int s=0,fh=1;char ch=getchar();
     9     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
    10     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
    11     return s*fh;
    12 }
    13 int Lowbit(int o){return o&(-o);}
    14 void Update(int o,int o1)
    15 {
    16     while(o<=n)
    17     {
    18         BIT[o]+=o1;
    19         o+=Lowbit(o);
    20     }
    21 }
    22 int Sum(int o)
    23 {
    24     int sum=0;
    25     while(o>0)
    26     {
    27         sum+=BIT[o];
    28         o-=Lowbit(o);
    29     }
    30     return sum;
    31 }
    32 int main()
    33 {
    34     int tot,i,wz;
    35     LL ans;
    36     while(1)
    37     {
    38         n=read();if(n==0)break;
    39         for(i=1;i<=n;i++){a[i]=read();aa[i]=a[i];}
    40         memset(BIT,0,sizeof(BIT));
    41         sort(a+1,a+n+1);
    42         tot=unique(a+1,a+n+1)-(a+1);
    43         for(i=1;i<=tot;i++)Update(i,1);
    44         ans=0;
    45         for(i=1;i<=n;i++)
    46         {
    47             wz=lower_bound(a+1,a+tot+1,aa[i])-a;
    48             ans+=(LL)Sum(wz-1);
    49             if(BIT[wz]!=0)Update(wz,-1);
    50         }
    51         printf("%lld
    ",ans);
    52     }
    53     fclose(stdin);
    54     fclose(stdout);
    55     return 0;
    56 }
    View Code

     

  • 相关阅读:
    顺序容器添加,查询,删除元素
    使用fiddler对app做弱网测试
    工作总结
    软件测试面试题_3
    软件测试面试题_2
    软件测试面试题_1
    MySQL的下载及安装
    关于let以及var的区别
    关于获取各种浏览器可见窗口大小的一点点研究
    log4J指定类下面的日志分隔
  • 原文地址:https://www.cnblogs.com/Var123/p/5300334.html
Copyright © 2011-2022 走看看