zoukankan      html  css  js  c++  java
  • poj 2299

    Ultra-QuickSort
    Time Limit: 7000MS   Memory Limit: 65536K
    Total Submissions: 66949   Accepted: 25081

    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

    因为数组里元素比较大,所以需要离散化处理

     

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <string>
     5 #include <string.h>
     6 #include <cstring>
     7 #include <stdio.h>
     8 #define lowbit(x) x&(-x)
     9 
    10 using namespace std;
    11 const int maxn=5e5+10;
    12 typedef long long ll;
    13 
    14 int n;
    15 int a[maxn];
    16 ll c[maxn];
    17 
    18 struct Node{
    19     int v;
    20     int order;
    21 }b[maxn];
    22 
    23 void add(int x){
    24     for(int i=x;i<=n;i+=lowbit(i))
    25         c[i]+=1;
    26 }
    27 
    28 int getsum(int x){
    29     ll as=0;
    30     for(int i=x;i>0;i-=lowbit(i)){
    31 
    32         as+=c[i];
    33     }
    34     return as;
    35 }
    36 bool cmp(const Node&a,const Node&b){
    37     return a.v<b.v;
    38 }
    39 
    40 int main(){
    41     ios::sync_with_stdio(0);
    42     int i,j;
    43     while(~scanf("%d",&n)&&n){
    44         for(i=1;i<=n;i++){
    45             scanf("%d",&b[i].v);
    46             b[i].order=i;
    47         }
    48         sort(b+1,b+n+1,cmp);
    49         for(i=1;i<=n;i++){
    50             a[b[i].order]=i;
    51         }
    52         ll  ans=0;
    53         memset(c,0,sizeof(c));
    54         for(i=1;i<=n;i++){
    55             add(a[i]);
    56             ans+=(i-getsum(a[i]));
    57         }
    58         cout<<ans<<endl;
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    安全测试WEB安全渗透测试基础知识(三)
    二次开发的Selenium Demo版本
    服务端性能测试工具校验v1.2
    渗透H5棋牌游戏棋牌游戏开发
    安全测试WEB安全渗透测试基础知识(一)
    源码网址
    使用ScribeFire写网易博客 imsho@126的日志 网易博客
    ScribeFire:和firefox完美结合的博客离线编辑器 博客联盟
    如何设置让 Everything 在 Win7 下开机启动 小众软件
    流言终结者——C语言内存管理 michael的个人空间 开源中国社区
  • 原文地址:https://www.cnblogs.com/z-712/p/8644354.html
Copyright © 2011-2022 走看看