• 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 }
  • 相关阅读:
    【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
    Python入门之面向对象module,library,package之间区别
    Python入门之字典的操作详解
    Python Web学习笔记之TCP/IP协议原理与介绍
    Python Web笔记之高性能网络编程
    Python Web学习笔记之面试TCP的15个问题
    Python Web学习笔记之TCP/IP、Http、Socket的区别
    Python Web学习笔记之TCP、UDP、ICMP、IGMP的解释和区别
    Python Web学习笔记之IGMP和ICMP的差别
    Python设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/z-712/p/8644354.html
Copyright © 2020-2023  润新知