- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hdu1394 Minimum Inversion Number 线段树求逆序数详细解题报告
Hdu1394 Minimum Inversion Number
/*
Name: hdu1394解题报告
Copyright: ecjtu_acm训练基地
Author: yimao
Date: 09-08-10 20:47
Description: 线段树求逆序数
*/
一、题目
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
二、题目大意及分析
给定一个序列,对该序列的n种排列(排列如下)的每种排列的逆序数求最大值:
a1, a2, ..., an-1, an a2, a3, ..., an, a1 a3, a4, ..., an, a1, a2 ...an, a1, a2, ..., an-1
当初做这一题,花了好多时间,百度了好多,也问了学长,初看下面的代码看不懂,几天后再细看,终于弄懂了,同时自己写了个暴利的代码也过了,先说一下暴力的方法,再好过渡到线段树的做法。
输入数组时,每输入一个数,就for(j=0;ji-1;j++)比较大小,这样用sum把逆序数统计出来,其实这里才是暴力,至于后面的就很巧妙,公式很容易推出,因为题目总是把第一个数移到最后一个位置,所以原来比它小的数(和它构成逆序)在移动之后就不是逆序了,而原来比它大的数(不和它构成逆序)在移动之后就是逆序了,这样sum就变化了:
Sum=sum-(low[a[i]])+(up[a[i]]);
显然在序列0,1,2,…..n-1中
比a[i]小的数的个数是 Low[a[i]]=a[i];
比a[i]大的数的个数是 up[a[i]]=n-a[i]-1;
题目要求是循环移动n次,那么只要写个for,把a[0],a[1],a[2]……a[n-1]都移动一遍,sum进行n次上面的公式运算,同时记录最小值,就是最小逆序数了。
有了上面的说明,写暴力的代码(见下面)就很简单了。
那么接下来就是过渡到线段树了。
发现上面分两部分,第一是统计初始的逆序数,第二是按顺序循环移动n个值,在第二部分是O(n)时间,无法再优化了。那么关键是就是第一部分的优化,刚开始我没看太懂别人的代码,后来才醒悟过来,这题说是用线段树做,其实仅是统计第一次的逆序数时用到,那么线段树统计这第一次的逆序数思想是这样的:
先建一个空树;
逐个插入值(即输入的一个值);
在每插入一个值后就更新包含该区间的所有的数的个数(加一)。
为什么可以这样呢,下面引用一个人的说明:
(The flowering information is from gon
您可能关注的文档
最近下载
- 保险学结课论文.docx VIP
- 2025四川广安安辑项目管理有限公司第二批次招聘劳动合同工5人笔试参考题库附答案解析.docx VIP
- 呆呆鲨可爱卡通风AI应用科普模版.pptx VIP
- 中考数学复习重难题型真题再现及题型预测(全国通用)专题01简单计算题(实数混合计算、整式分式化简、解分式方程、解不等式及方程)(原卷版+解析).docx VIP
- 实验室废物处理培训.pptx VIP
- 2025四川广安安辑项目管理有限公司第二批次招聘劳动合同工5人笔试备考题库及答案解析.docx VIP
- 劳力士培训课件.ppt VIP
- 医学大数据分析与挖掘方法及应用研究综述.pptx VIP
- 第一视角与第三视角.ppt VIP
- 窗口人员劳务派遣投标方案模板(345).doc VIP
原创力文档


文档评论(0)