ZOJ Problem Set - 1201
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=201
这题目还是蛮有意思的,O(n*n)的算法很容易想到,代码就从简从略了。
感觉应该有O(nlogn)的算法。因为O(n*n)的算法利用到的条件太少了。
P 5 9 1 8 2 6 4 7 3
B 0 0 2 1 3 2 4 2 6
(B[k]=I[P[k]])
仔细看的话,能够看出,对于同一个B的P是递增的。
这点容易证明,证明如下。
若存在B[i]=B[j]=k,i<j,假设P[i]>P[j]。
根据假设有,P[i]的左边有且仅有k个数大于它。
而P[i]>P[j],则P[j]的左边至少有k+1个数大于它,与仅有k个大于它的假设矛盾。
所以对于同一个B的P是递增的。
根据这个结论,如果知道了Inversion的那组数,也就得到了Permutation的局部排序。
这个局部排序的代价是O(nlogn),这显然也是这个问题的下限了。
问题是如何将局部排序的结果合并起来,并且这个合并的过程的复杂度不能超过O(nlogn)。
这是个值得讨论的问题。