http://blog.csdn.net/wiking__acm/article/details/7920429
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
int l,r,nsum;
}tree[50000];
void build(int id,int x,int y)
{
tree[id].l=x;
tree[id].r=y;
tree[id].nsum=0;
if(x==y){
return ;
}
int mid=(x+y)>>1;
build((id<<1),x,mid);
build((id<<1)+1,mid+1,y);
}
void add(int id,int x)
{
int left=tree[id].l;
int right=tree[id].r;
int mid=(left+right)>>1;
if(left==right)
{
tree[id].nsum=1;
return ;
}
if(x<=mid) add(id<<1,x);
else add((id<<1)+1,x);
tree[id].nsum=tree[id<<1].nsum+tree[(id<<1)+1].nsum;
}
int query(int id,int x,int y)
{
int left=tree[id].l;
int right=tree[id].r;
int mid=(left+right)>>1;
if(x==left && y==right)
return tree[id].nsum;
if(y<=mid) return query(id<<1,x,y);
else if(mid+1<=x) return query((id<<1)+1,x,y);
else return query(id<<1,x,mid)+query((id<<1)+1,mid+1,y);
}
int p[5050];
int main()
{
int n,i,j,k;
while(cin>>n)
{
build(1,0,n-1);
int sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i]);
add(1,p[i]);
sum+=query(1,p[i],n-1)-1;
}
int ans=sum;
for(i=1;i<n;i++)
{
sum=sum+n-1-p[i]-p[i];
if(sum<ans)
ans=sum;
}
printf("%d\n",ans);
}
}