hdu1394-Minimum Inversion Number(线段树)

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 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值