您的位置:首页 > 其它

Minimum Inversion Number HDU 1394

2013-04-17 21:48 281 查看
用树状数组求逆序数。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 5004
int a[maxn];
int n=maxn;
int lowbit(int i)
{
return i&(-i);
}
int Sum(int i)
{
int sum=0;
while(i>=1)
{
sum+=a[i];
i-=lowbit(i);
}
return sum;
}
void Update(int i,int tem)
{
while(i<=n)
{
a[i]+=tem;
i+=lowbit(i);
}
}
int main()
{
int m,i;
int sum,min,k;
int b[maxn],c[maxn];
while(scanf("%d",&m)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=m;i++)
{
scanf("%d",&b[i]);//用b接受原数据
b[i]++;//防止输入0,造成死循环。
}
sum=0;
for(i=1;i<=m;i++)
{
Update(b[i],1);//离散化数据
sum+=Sum(maxn)-Sum(b[i]);//求出比这个数小的
}
min=sum;
for(i=1;i<=m;i++)//把第一个数变换到最后.
//Sum(b[i]-1)为变换之前第一个数构成的逆序数量,(m-1-Sum(b[i]-1)为变换之后增加的逆序的数量。
{
k=sum-Sum(b[i]-1)+(m-1-Sum(b[i]-1));
if(k<min)
min=k;
sum=k;
} printf("%d\n",min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: