poj2299 Ultra-QuickSort

来源:互联网 发布:python主函数 编辑:程序博客网 时间:2024/05/23 07:23

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int n;struct node{    int val;    int num;//编号}inPut[500050];//用于处理输入的数组int a[500050];//离散化后的数组int c[500050];//数状数组int lowbit(int i){    return i&(-1*i);}void insert(int i)//维护树状数组{    while(i<=n)    {        c[i]++;        i+=lowbit(i);    }}bool cmp(node a,node b){    return a.val<b.val;}int getsum(int x)//计算小于等于x的个数{    int ans=0;    for(int i=x;i>=1;i-=lowbit(i))    {        ans+=c[i];    }    return ans;}int main(){    while(cin>>n,n)    {        for(int i=1;i<=n;i++)        {            cin>>inPut[i].val;            inPut[i].num=i;        }        //离散化        sort(inPut+1,inPut+n+1,cmp);        for(int i=1;i<=n;i++)        {            a[inPut[i].num]=i;        }        //离散化完成        memset(c,0,sizeof(c));        long long ans=0;        for(int i=1;i<=n;i++)        {            insert(a[i]);//将该数据插入到树状数组中            ans+=i-getsum(a[i]);//i表示当前插入树状数组的元素个数,getsum处理出了已插入的数中小于等于当前的数的个数        }        cout<<ans<<endl;    }    return 0;}

题意:

描述:

在这个问题中,你必须去分析一个特殊的排序算法。这个算法处理n个数,通过不断交换两个相邻的数,直至这个n个数成升序排列

比如输入序列:

9 1 0 5 4

目标序列是

0 1 4 5 9

你的任务是计算需要交换多少次

对样例

9 1 0 5 4

离散化为

5 2 1 4 3

原创粉丝点击