http://acm.hdu.edu.cn/showproblem.php?pid=1394
线段树,序列数定义;如下链接,证明比较详细http://wenku.baidu.com/view/6e02b7492e3f5727a5e9623f.html
// File Name: hdu1394.cpp
// Author: bo_jwolf
// Created Time: 2013年08月16日 星期五 15时43分25秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
using namespace std ;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 5555 ;
int sum[ maxn << 2 ] ;
void PushUp( int rt )
{
sum[ rt ] = sum[ rt << 1 ] + sum[ rt << 1 | 1 ] ;
}
void build( int l , int r , int rt )
{
sum[ rt ] = 0 ;
if( l == r )
return ;
int m = ( l + r ) >> 1 ;
build( lson ) ;
build( rson ) ;
}
void update( int p , int l , int r , int rt )
{
if( l == r )
{
sum[ rt ] ++ ;
return ;
}
int m = ( l + r ) >> 1 ;
if( p <= m )
update( p , lson ) ;
else
update( p , rson ) ;
PushUp( rt ) ;
}
int query( int L , int R , int l , int r , int rt )
{
if( L <= l && r <= R )
{
return sum[ rt ] ;
}
int m = ( l + r ) >> 1 ;
int ret = 0 ;
if( L <= m )
ret += query( L , R ,lson ) ;
if( R > m )
ret += query( L , R , rson ) ;
return ret ;
}
int x[ maxn ] ;
int main()
{
int n ;
while( ~scanf( "%d" , &n ) )
{
build( 1 , n , 1 ) ;
int sum = 0 ;
for( int i = 1 ; i <= n ; ++i )
{
scanf( "%d" , &x[ i ] ) ;
sum += query( x[ i ] + 1 , n , 1 , n , 1 ) ;
update( x[ i ] + 1, 1 , n , 1 ) ;
}
int ret = sum ;
for( int i = 1 ; i <= n ; ++i )
{
sum += n - x[ i ] - x[ i ] - 1 ;
ret = min ( ret , sum ) ;
}
cout << ret << endl ;
}
return 0 ;
}