树状数组 Ultra-QuickSort 离散化+逆序数

来源:互联网 发布:usb共享电脑网络给手机 编辑:程序博客网 时间:2024/06/18 07:50
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
59105431230
Sample Output
60
一个数列靠相邻两个交换的方法变成正序 就是求他的逆序数 没想明白为什么
统计逆序数的方法就是query(i) sum+=i-query(i)query(i)查询到比当前数小的数 i-query(i)就是比当前数大的数比如下标 1 2 3 4 5  值 0 0 0 0 0插入个5把               这是逆序数为1-query(5)=0 不存在 下标 1 2 3 4 5   值 0 0 0 0 1插入个2把               这是逆序数为2-query(2)=1 下标 1 2 3 4 5   值 0 1 0 0 1
然而这个题要用离散化 
#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=500005;int a[maxn],c[maxn];int n;struct org{    int v, f;}b[maxn];int cmp(org a,org b){    return a.v<b.v;}int lowbit(int i){    return i&(-i);}int update(int i,int x){    while(i<=maxn)    {        c[i]=c[i]+x;        i=i+lowbit(i);    }    //cout<<"1"<<endl;}int query(int i){    int sum=0;    while(i>0)
{        sum+=c[i];        i=i-lowbit(i);    }    return sum;}int main(){    while(~scanf("%d",&n)&&n)    {        memset(c,0,sizeof(c));        for(int i=1;i<=n;i++)        {            scanf("%d",&b[i].v);            b[i].f=i;        }        sort(b+1,b+n+1,cmp);        for(int i=1;i<=n;i++)        {            a[b[i].f]=i;        }        long long  sum=0;        for(int i=1;i<=n;i++)        {            update(a[i],1);            sum+=i-query(a[i]);        }        cout<<sum<<endl;    }    return 0;}

阅读全文
0 0
原创粉丝点击