码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1394 Minimum Inversion Number

时间:2015-05-24 08:52:21      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

题意:

给一个整数序列,为0-n-1的一个排列,然后每次将这个排列的第一个数字移到最后一个,总共进行n-1次,这样加上原始序列总共有 n个序列,求出这n个序列中逆序对数的最小值。


这道题本来是划分到线段树的,但考虑到n<=5000,并且这n个序列并不是没有关系的,所以可以根据逆序对数的性质找出下一个序列和当前序列的关系,然后只需要用n^2的算法求出初始序列的逆序对数,然后求接下来的序列的逆序对数都只需要O(1),这道题就能AC了,我简直太机智了。。。

具体关系推导过程:

不妨把当前序列设为 a[i],a[i+1]....a[n-1],a[0],a[1],...,a[i-1],把a[i]移到最后的时候,a[i]到a[n-1]范围内的所有逆序数对(设为b[i])都应该减掉,然后加上n-i-1-b[i](即当前非逆序数对的个数)。这时候序列变为a[i+1]....a[n-1],a[0],a[1],...,a[i-1],a[i],所以应该加上a[0],a[1],...,a[i-1]与a[i]构成的逆序数对个数(记为f[i]),之前序列中a[i]与a[0],a[1],...,a[i-1]构成的逆序数对(i-f[i])没有了,所以应该减去.

所以关系式为:ans[i+1]=ans[i]-b[i]+(n-i-1-b[i])+f[i]-(i-f[i]);


代码:




hdu 1394 Minimum Inversion Number

标签:

原文地址:http://blog.csdn.net/u013840081/article/details/45941009

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!