pku 2299 Ultra-QuickSort(求逆序数)

树状数组 7420K 500MS
#include <stdio.h>
#include <string.h>
#include <algorithm>

 

using namespace std;

typedef long long LL;
#define MAXN 500010

int n,ihash[MAXN],c[MAXN];

struct SNode
{
    int val,id;
} seq[MAXN];

inline bool mycmp(const SNode &s1,const SNode &s2)
{
    return s1.val<s2.val;
}

inline int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int delta)
{
    while(x<MAXN)
    {
        c[x]+=delta;
        x+=lowbit(x);
    }
}
int getSum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}

int main()
{
    int i,idx;
    while(scanf("%d",&n),n)
    {
        for(i=1; i<=n; i++)
        {
            scanf("%d",&seq[i].val);
            seq[i].id=i;
        }
        sort(seq+1,seq+n+1,mycmp);
        idx=1;
        for(i=1; i<=n; i++)
        {
            ihash[ seq[i].id ] = idx++;
        }
        //     for(i=1;i<=n;i++) printf("%d ",ihash[i]); printf("\n");
        memset(c,0,sizeof(c));
        LL ans=0;
        for(i=1; i<=n; i++)
        {
            update(ihash[i],1);
            ans += ( i-getSum(ihash[i]) );
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

 


//*****************************************************************************************
归并排序 3700K 391MS
#include <stdio.h>

#define MAXN 500005

int a[MAXN],tmp[MAXN];
long long ans;

void merge(int l,int mid,int r)
{
    int i=l,j=mid+1,k=0;
    while(i<=mid && j<=r)
    {
        if(a[i]<=a[j]) tmp[k++]=a[i++];
        else
        {
            tmp[k++]=a[j++];
            ans += mid-i+1;
        }
    }
    while(i<=mid) tmp[k++]=a[i++];
    while(j<=r) tmp[k++]=a[j++];
    for(i=l,k=0;i<=r;i++) a[i]=tmp[k++];
}

void MergeSort(int l,int r)
{
    if(l<r)
    {
        int mid=(l+r)>>1;
        MergeSort(l,mid);
        MergeSort(mid+1,r);
        merge(l,mid,r);
    }
}

int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        ans=0;
        MergeSort(0,n-1);
        printf("%I64d\n",ans);
    }
    return 0;
}

posted @ 2010-09-07 20:30  菜到不得鸟  阅读(129)  评论(0)    收藏  举报