标签:hdu
10 1 3 6 9 0 8 5 7 4 2
16
#include<stdio.h>
#include<string.h>
#define M 5005
struct tree{
int l,r,sum;
}tree[M<<2];
int x[M];
int max(int a,int b){
if(a>b)return a;
else return b;
}
void build(int l,int r,int root)
{
tree[root].l=l;
tree[root].r=r;
tree[root].sum=0;
if(l==r)return;
int mid=l+r>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
}
void pushup(int root){
if(tree[root].l==tree[root].r)return;
tree[root].sum=tree[root<<1].sum+tree[root<<1|1].sum;
}
void update(int l,int r,int root)
{
if(tree[root].l==l&&tree[root].r==r){
tree[root].sum++;
return;
}
int mid=tree[root].l+tree[root].r>>1;
if(r<=mid)update(l,r,root<<1);
else if(l>mid)update(l,r,root<<1|1);
else {
update(l,mid,root<<1);
update(mid+1,r,root<<1|1);
}
pushup(root);
}
int query(int l,int r,int root)
{
if(tree[root].l==l&&tree[root].r==r){
return tree[root].sum;
}
int mid=tree[root].l+tree[root].r>>1;
if(r<=mid)return query(l,r,root<<1);
else if(l>mid)return query(l,r,root<<1|1);
else return query(l,mid,root<<1)+query(mid+1,r,root<<1|1);
}
int main()
{
int n,m,i,j,k,a[M],b,tot;
while(scanf("%d",&n)!=EOF)
{
tot=0;
build(0,n-1,1);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
tot=tot+query(a[i],n-1,1); //询问【a[i],n-1】里面有几个数,就是问比a[i]大的数有几个。
update(a[i],a[i],1);
}
int mini=tot;
for(i=0;i<n;i++)
{
tot=tot+n-1-2*a[i];
if(tot<mini)mini=tot;
}
printf("%d\n",mini);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 1394 Minimum Inversion Number(线段树)
标签:hdu
原文地址:http://blog.csdn.net/aaaaacmer/article/details/47113959