`

Minimum Inversion Number 线段树求逆序数

 
阅读更多

 

Minimum Inversion Number

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 474 Accepted Submission(s): 217


Problem Description
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.

For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:

a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)

You are asked to write a program to find the minimum inversion number out of the above sequences.
 

 

Input
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.
 

 

Output
For each case, output the minimum inversion number on a single line.
 

 

Sample Input
10
1 3 6 9 0 8 5 7 4 2
 

 

Sample Output

 

16
#include<stdio.h>
struct Shu
{
	int zuo;
	int you;
	int date;
}shu[5000*3];
int p[5000+10];
void buildtree(int a,int b,int n=1)
{
	shu[n].zuo=a;
	shu[n].you=b;
	shu[n].date=0;
	if(a==b)return;
	int zhong=(a+b)>>1;
	buildtree(a,zhong,2*n);
	buildtree(zhong+1,b,2*n+1);
}
void addtree(int a,int n=1)
{
	shu[n].date++;
	if(shu[n].zuo==shu[n].you)return;
	int zhong=(shu[n].zuo+shu[n].you)>>1;
	if(a<=zhong)addtree(a,2*n);
	else addtree(a,2*n+1);
}
int findtree(int a,int b,int n=1)
{
	if(shu[n].zuo==a&&shu[n].you==b)return(shu[n].date);
	int zhong=(shu[n].zuo+shu[n].you)>>1;
	if(b<=zhong)return(findtree(a,b,2*n));
	else if(a>zhong)return(findtree(a,b,2*n+1));
	else return(findtree(a,zhong,2*n)+findtree(zhong+1,b,2*n+1));
}
int main()
{
//	freopen("in.txt","r",stdin);
	int min;
	int n;
	int sum;
	int i;
	while(scanf("%d",&n)!=EOF)
	{
		buildtree(0,n-1);
		sum=0;
		for(i=0;i<n;i++)
		{
			scanf("%d",&p[i]);
			sum+=findtree(p[i],n-1);
			addtree(p[i]);
		}
		min=sum;
		for(i=0;i<n-1;i++)
		{
			sum=sum+n-1-2*p[i];
			if(sum<min)min=sum;
		}
		printf("%d\n",min);
	}
	return(0);
}

 

 

 

分享到:
评论

相关推荐

    线段树完整版

    **案例3:hdu1394 Minimum Inversion Number** - **题意**: 给定一个序列,求最少需要多少次逆序操作使得该序列变为非递减序列。 - **解决思路**: 使用线段树来维护区间内的逆序对数量,通过动态规划的方法来求解...

    求数组的逆序数

    逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序对的数量。这个概念在理解数组的有序性、数据的复杂度分析以及解决特定问题时非常有用。 ...

    用以计算某一排序的逆序数,输入可为整型或字符串

    在编程领域,逆序数(Inversion Count)是排序算法中的一个重要概念,它用来衡量一个序列的无序程度。在给定的标题“用以计算某一排序的逆序数,输入可为整型或字符串”中,我们关注的是如何计算逆序对的数量,无论...

    11087 统计逆序对

    a[j] 则称 i j 为a数组的一个逆序对(inversion) 比如&lt;2 3 8 6 1&gt;有5个逆序对 请考虑一个最坏情况O nlogn 的算法确定n个元素的逆序对数目 注意此题请勿用O n^2 的简单枚举去实现 输入格式 第一行:n ...

    算法分析 统计逆序对

    设a[0…n-1]是一个包含n个数的数组,若在i的情况下,有a[i]&gt;a[j],则称(i, j)为a数组的一个逆序对(inversion)。 比如 ,3,8,6,1&gt; 有5个逆序对。请采用类似“合并排序算法”的分治思路以O(nlogn)的效率来实现逆序对...

    逆序对问题

    设a[0…n-1]是一个包含n个数的数组,若在i的情况下,有a[i]&gt;a[j],则称(i, j)为a数组的一个逆序对(inversion)。 比如 ,3,8,6,1&gt; 有5个逆序对。 请考虑一个最坏情况O(nlogn)的算法确定n个元素的逆序对数目。 注意此...

    matrix-inversion-verilog-master_inversion_verilog_matrixinverse_

    总的来说,"matrix-inversion-verilog-master"项目提供了一个用Verilog实现的矩阵求逆模块,它涉及到了硬件描述语言的基本概念、线性代数知识以及硬件设计的优化技巧。这个项目对于学习Verilog和硬件设计的人来说是...

    On Matrix Inversion for LTE MIMO_inversion_LTE_dsp_矩阵求逆_mimo_

    矩阵求逆在这里用于构建最小均方误差(Minimum Mean Square Error, MMSE)或最大似然(Maximum Likelihood, ML)的信道估计模型。均衡器设计的目标是抵消多径传播和干扰造成的失真,矩阵求逆在频率域或时域的均衡...

    inversion.rar_2D-inversion_2d inversion_gravity_gravity inversio

    gravity 2D inversion

    求逆.rar_c++ 求逆矩阵_matrix inversion_求逆矩阵_矩阵 求逆_矩阵求逆

    矩阵求逆c语言算法!

    Inversi.rar_gravity inversion_inversion

    inversion non-linear

    GAN Inversion A Survey.pdf

    GAN逆推理(GAN Inversion)是近年来兴起的一种技术,旨在将给定的图像还原到预训练的GAN模型的潜在空间中,以便通过生成器faithfully重建图像。作为连接真实图像域和虚拟图像域的桥梁,GAN逆推理技术在图像编辑应用...

    inversion.c

    给定一个数N(i.e.12),N=abs(N-reverse_N). (i.e, abs(12-21))在第几轮后N=0.

    inversion-of-string.rar_inversion

    本次我们关注的主题是“字符串的逆序操作”,这通常涉及到对输入的字符串进行反转,使得原字符串的字符顺序颠倒。这个过程在很多应用中都有所体现,如文本处理、数据解析以及算法设计等。我们将探讨如何在不同的编程...

    modis-cloud-modis-modis_aerosol_inversion等.rar

    插件包括四部分modis-cloud去云插件、modis-modis_aerosol_inversion反演插件、6s程序和lut表,modis LB反演所需要的的插件基本包括在内。亲适ENVI5.1可行。成功反演,提供给大家学习使用。不用积分。

    Inversion Rayleigh.rar_ill2u4_inversion_made6y7_rayleigh_面波

    《面波计算与地球物理研究:Inversion Rayleigh方法详解》 在地球物理学领域,对地壳结构的理解和探测是至关重要的。Inversion Rayleigh方法是进行面波分析的一种技术,它通过计算和分析面波的灵敏度来揭示地下介质...

    full_waveform_inversion-master.zip

    全波形反演(Full Waveform Inversion, FWI)是一种在地球物理学领域广泛应用的先进技术,主要用于速度模型构建。此技术的核心在于通过精确地拟合地震记录中的完整波形来反推地下介质的物理属性,尤其是地震波速度。...

Global site tag (gtag.js) - Google Analytics