[讨论]ZOJ Problem Set - 1201

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)。

这是个值得讨论的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值