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;
}
浙公网安备 33010602011771号