http://acm.hdu.edu.cn/showproblem.php?pid=1394&&线段树之求逆序数

原创 2012年03月24日 11:02:02
#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
#define N 5005
#define L(x)(x<<1)
#define R(x) (x<<1|1)
#define M(x,y) ((x+y)>>1)
using namespace std;
typedef struct str
{
	int l;
	int r;
	int key;
}Node;
Node node[N<<1];
int value[N];
void bulid(int t,int l,int r)
{
	node[t].l=l;
	node[t].r=r;
	node[t].key=0;
	if(l==r-1)return ;
	int mid=M(l,r);
	bulid(L(t),l,mid);
	bulid(R(t),mid,r);
}
void update(int t,int a)
{
	node[t].key++;
	if(node[t].l==(node[t].r-1))  return;
	int mid=M(node[t].l,node[t].r);
	if(a>=mid) update(R(t),a);
	else update(L(t),a);
}
int Quary(int t,int a,int b)
{
	if(node[t].l==a&&node[t].r==b) return node[t].key;
	int mid=M(node[t].l,node[t].r);
	if(a>=mid) return Quary(R(t),a,b);
	else
	{
		if(b<=mid) return Quary(L(t),a,b);
		else return  Quary(L(t),a,mid)+Quary(R(t),mid,b);
	}
}
int main()
{
	int n;
	while(~scanf("%d",&n))
	{ 
		int sum=0;
		bulid(1,0,n);
		
		for(int i=1;i<=n;++i)
		{  
			scanf("%d",&value[i]);
			sum+=Quary(1,value[i],n);
		     update(1,value[i]);
		}
		int k=sum;
		for(int i=n;i>=2;--i)
		{
			 sum=sum+value[i]-(n-1-value[i]);
			if(sum<k) k=sum;
		}
		printf("%d\n",k);
	}return 0;
}

线段树或树状数组求逆序数(附例题)

线段树或树状数组求逆序数 假设给你一个序列 6 1 2 7 3 4 8 5, 首先我们先手算逆序数, 设逆序数为 N; 6的前面没有比他大的数 N +=0 1的前面有一个比他大的数 N+=1 ...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年08月21日 13:02
  • 1482

线段树求逆序数(单点更新)

题目:HDU1394 Minimum Inversion Number   若abcde...的逆序数为k,那么bcde...a的逆序数是多少?我们假设abcde...中小于a的个数为t , 那么大于...
  • ACdreamers
  • ACdreamers
  • 2013年02月09日 11:53
  • 2620

hdu1757 矩阵快速幂--

http://acm.hdu.edu.cn/showproblem.php?pid=1757 链接镇楼。。 给出
  • u014625544
  • u014625544
  • 2014年04月26日 16:13
  • 850

hdu1394(暴力/线段树/归并排序求逆序对的个数)

题目链接:Minimum Inversion Number 题目大意
  • pmt123456
  • pmt123456
  • 2017年02月18日 00:08
  • 352

归并排序求逆序数(POJ 1804,POJ 2299,HDU 4911)

首先,明确两个概念: 逆序对:数列a[1],a[2],a[3]…中的任意两个数a[i],a[j] (ia[j],那么我们就说这两个数构成了一个逆序对. 逆序数:一个数列中逆序对的总数. 例题一:POJ...
  • u013519226
  • u013519226
  • 2015年03月31日 16:54
  • 863

C语言实现逆序数

逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?当初我是先求出它的位数,接着求余数,余数再乘上所对应的的10的次方,其实10的次方也有专门的函数pow()。 ...
  • u010180915
  • u010180915
  • 2013年10月06日 18:46
  • 3427

求逆序数对个数(微软2010年笔试题)

题目: 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和...
  • bbewx
  • bbewx
  • 2014年04月22日 22:40
  • 1716

【逆序数】哎呀为什么会有人想用QuickSort求逆序数嘛!

(这篇文章底端的图为什么这么大……不管了) [--大家好我们第一个团本CD就通了PT而且打掉了H老一呢,看不懂这行的请当它不存在--] 事情,大概是这样的—— (没错这又是一篇我被作业算法血虐的心...
  • okcd00
  • okcd00
  • 2016年09月29日 00:01
  • 1611

求逆序数的三种数据结构比较

本文比较树状数组,线段树,还有一种unnamed的树状结构,在求逆序数中的运行效率。...
  • baihacker
  • baihacker
  • 2014年08月23日 16:33
  • 2715

hdu 5196 DZY Loves Inversions(树状数组,二分法,逆序数)

DZY Loves Inversions Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/...
  • acm_cxq
  • acm_cxq
  • 2016年07月25日 17:09
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:http://acm.hdu.edu.cn/showproblem.php?pid=1394&&线段树之求逆序数
举报原因:
原因补充:

(最多只允许输入30个字)