poj2299 Ultra-QuickSort

#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

你可能感兴趣的:(poj2299 Ultra-QuickSort)