http://acm.hdu.edu.cn/showproblem.php?pid=1394
先对初始队列统计逆序对数,然后再把每个数一个个移到后面统计逆序对数,取最小。
注意,这里因为是n个数的范围是0~n-1,所以可以利用其性质统计逆序对数。
把位于第一位的num[i]移到最后一位,则变化的逆序对数是在上一个序列(即num[i]为第一位的序列)的基础上加上比num[i]大的数的个数,再减去比num[i]小的数的个数(因为num[i]移到最后以后,只能与前面比他大的数构成逆序对,而在上一个序列中与num[i]构成逆序对的在此序列则没办法构成)。
在求原始序列的逆序对数的时候,可以用线段树or树状数组,特别要注意的是,树状数组的下标不能取0!!要不然会进入死循环~~
代码如下: