先说一下逆序数的概念:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那末它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。 ——这是北大《高等代数》上的定义。题意:给出一个排列,排列中的数各不相同,都是从0到n-1,要求得到的是一个最短的逆序的长度,这些子序列是转动原来的序列得到的。一种最基本的做法:就是枚举每一个点求出这个点前面比它的数的个数,然后加起来。还好这种做法没有超时,这里有一种O(nlog(n))的算法就是利用点树。我在网上找过,网上关于点树的资料很少,百度百科里面有一篇。还有就是http://www.cnitblog.com/cockerel/archive/2006/09/13/16806.html不过好像是一个人写的. @_@ ^_^以下借用了他的实现
posted on 2010-05-17 17:17 acleast 阅读(645) 评论(0) 编辑 收藏 引用
Powered by: C++博客 Copyright © acleast