Description
Input
Output
Sample Input
Sample Output
# include<cstdio>
# include<iostream>
using namespace std;
# define MAX 5004
# define inf 99999999
# define lid id<<1
# define rid id<<1|1
struct Segtree
{
int l,r;
int sum;
}tree[MAX*4];
int a[MAX];
void push_up( int id )
{
tree[id].sum = tree[lid].sum+tree[rid].sum;
}
void build ( int id,int l,int r )
{
tree[id].l = l; tree[id].r = r;
tree[id].sum = 0;
if ( l==r )
{
return;
}
int mid = ( tree[id].l+tree[id].r )/2;
build ( lid,l,mid);
build ( rid,mid+1,r);
push_up(id);
}
void update( int id,int x,int val )
{
if ( tree[id].l==tree[id].r )
{
tree[id].sum = 1;
return;
}
int mid = ( tree[id].l+tree[id].r )/2;
if ( x<=mid )
update(lid,x,val);
else
update(rid,x,val);
push_up(id);
}
int query( int id,int l,int r )
{
if ( tree[id].l==l&&tree[id].r==r )
{
return tree[id].sum;
}
int mid = ( tree[id].l+tree[id].r )/2;
if ( r <= mid )
return query(lid,l,r);
else if ( l > mid )
return query(rid,l,r);
else
{
return query(lid,l,mid)+query(rid,mid+1,r);
}
}
int main(void)
{
int n;
while ( scanf("%d",&n)!=EOF )
{
for ( int i = 0;i < n;i++ )
scanf("%d",&a[i]);
build(1,0,n-1);
int sum = 0;
for ( int i = 0;i < n;i++ )
{
if( a[i]!=n-1 )
{
sum+= query(1,a[i]+1,n-1);
update(1,a[i],1);
}
else
{
sum+=query(1,a[i],n-1);
update(1,a[i],1);
}
}
int ans = inf;
ans = min(ans,sum);
for ( int i = 0;i < n;i++ )
{
sum-=a[i];
sum+=n-1-a[i];
ans = min(ans,sum);
}
printf("%d\n",ans);
}
return 0;
}
HDU 1394 Minimum Inversion Number (线段树,单点更新)
原文:http://www.cnblogs.com/wikioibai/p/4741139.html