ことばがありあまれどなお、 このゆめはつづいてく|

trsins

园龄:3年10个月粉丝:18关注:2

【做题记录】ARC068D Solitaire

  • ARC068D Solitaire

    • 算法:dp

题目:

1n 顺序加入双端队列(每次可加头可加尾),再删除(每次可删头可删尾),求有多少种删除序列,使得 1 是第 k 个被删的。

1n,k2000

题解:

这里是一个 O(n2) 的做法,在这篇题解中有 O(n+q) 的线性做法。

考虑这个双端队列长什么样:应该是一个1 为分割点,左边是一个单调下降序列,右边是单调上升序列

考虑删除的第 k 个点要是 1,弹出时是选择两端中的一端弹出,拆开弹出的序列,一部分为前端弹出的数,另一部分为后端弹出的数,于是这两部分就是单调递减的,且前 k1 个数中其中一个序列的最小值一定大于后 nk 个数中的最大值。

然后因为在确定了 1 的位置后,之后随便删除,所以剩下的随便排序,有 2nk1 种。

直接 dp:fi,j 表示前 k1 个数中前 i 个数,这些数的最小值为 j

考虑下一个数 kj 的大小关系:

  1. fi,jfi+1,k(jk)

  2. fi,jfi,j+1(k>j)

总时间复杂度 O(n2)

本文作者:trsins

本文链接:https://www.cnblogs.com/trsins/p/15815365.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   trsins  阅读(48)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示