hdu 1394 Minimum Inversion Number(最小逆序数)

#include <stdio.h>
#include <string.h>

 

typedef long long LL;
#define MAXN 5005

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

inline int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int delta)
{
    while(x<=n)
    {
        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()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    while(scanf("%d",&n)!=EOF)
    {
        memset(c,0,sizeof(*c)*(n+1));
        int i;
        LL sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            update(a[i]+1,1);
            sum += i - getSum(a[i]+1);
        }
        int ans = sum;
        for(i=1;i<n;i++)
        {
            sum = sum - a[i] + n - a[i] - 1;
            if(ans > sum) ans = sum;
        }
        printf("%d\n",ans);
    }
    return 0;
}

posted @ 2010-09-11 09:23  菜到不得鸟  阅读(121)  评论(0)    收藏  举报