您的位置:首页 > 其它

HDU 1394 Minimum Inversion Number

2012-02-16 15:04 204 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1394

View Code

//1394
#include <stdio.h>
const int N=5010;
int st[4*N],a
;
void newup(int rt)
{
st[rt]=st[rt*2]+st[rt*2+1];
}
void build(int l,int r,int rt)
{
if (l==r)
{
st[rt]=0;
return;
}
int m=(l+r)/2;
build(l,m,rt*2);
build(m+1,r,rt*2+1);
newup(rt);
}
void update(int p,int l,int r,int rt)
{
if (l==r)
{
st[rt]++;
return;
}
int m=(l+r)/2;
if (p<=m) update(p,l,m,rt*2);
else update(p,m+1,r,rt*2+1);
newup(rt);
}
int query(int a,int b,int l,int r,int rt)
{
if (a<=l && r<=b) return st[rt];
int m=(l+r)/2,s=0;
if (a<=m) s+=query(a,b,l,m,rt*2);
if (b>m) s+=query(a,b,m+1,r,rt*2+1);
return s;
}
int main()
{
int n,i;
while (~scanf("%d",&n))
{
build(0,n-1,1);
int s=0;
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s+=query(a[i],n-1,0,n-1,1);
update(a[i],0,n-1,1);
}
int min=s;
for (i=1;i<=n;i++)
{
s+=n-a[i]-a[i]-1;
if (s<min) min=s;
}
printf("%d\n",min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: