zoukankan      html  css  js  c++  java
  • poj2299:Ultra-QuickSort

    求逆序对即可,然而发现还是bit容易写。。
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Ultra-QuickSort
    Time Limit: 7000MS   Memory Limit: 65536K
    Total Submissions: 49549   Accepted: 18142

    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<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 #define ll long long
     6 #define rep(i,n) for(int i=1;i<=n;i++)
     7 struct data{
     8     ll w;int c;
     9     bool operator<(const data&rhs)const {
    10       return w<rhs.w;}
    11 }e[500005];
    12 int t[500005],n;
    13 int lowbit(int x){return x&-x;}
    14 void insert(int x){
    15     for(int i=x;i<=n;i+=lowbit(i))
    16       t[i]++;
    17 }
    18 int find(int x){
    19     int tmp=0;
    20     for(int i=x;i;i-=lowbit(i))
    21         tmp+=t[i];
    22     return tmp;
    23 }
    24 int main(){
    25     while(scanf("%d",&n)&&n){
    26         memset(t,0,sizeof(t));
    27         rep(i,n){
    28             scanf("%lld",&e[i].w);
    29             e[i].c=i;
    30         }
    31         sort(e+1,e+n+1);
    32         ll ans=0;
    33         rep(i,n){
    34             insert(e[i].c);
    35             ans+=i-find(e[i].c);
    36         }
    37         printf("%lld
    ",ans);
    38     }
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    如何才能成为一个真正的编程高手?
    C#中base 关键字的作用
    线程间值的传递
    C#多线程 线程的启动
    C#接口的作用(经典)
    IEnumerable和IQueryable和Linq的查询
    CSS-定位
    HTML 常用标签
    CSS十大选择器
    前端开发师职业生涯入坑指南
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4849609.html
Copyright © 2011-2022 走看看