双端队列

匿名 (未验证) 提交于 2019-12-02 23:51:01

双端队列

给出一个长度为n的数列\(\{a_i\}\),从左至右进行操作,假设是对第i个数操作,你有以下选择

  1. 创建一个新的双端队列,并将\(a_i\)入队
  2. 入队一个已有的双端队列

最后需要满足所有的双端队列会有一种方案首尾相接形成一个新的数列,这个数列单调递增,\(n\leq 2\times 10^5\)

从答案的角度思考问题,最后的数列是一个单调递增的数列,双端队列类似这个数列中的一个一个区间,于是又像是一道区间划分问题,很快反应出这个问题的一个通用性质,也就是一般可以递推。

先构造数列\(\{b_i\}\),令\(b_i=a_i\),再把\(\{b_i\}\)按从小到大排序,构造一个\(\{c_i\}\)\(c_i\)表示\(b_i\)\(\{a_i\}\)中出现的位置。

现在我们就只要合法地将\(\{b_i\}\)划分成尽可能少的区间,于是根据\(\{c_i\}\),我们发现把\(i\)作为自变量,\(c_i\)作为因变量,那么此时形成一个有一个最低点,最低点两端的图像都是单调的,这一段区间就可以作为双端队列中的元素,如图。

注意到这是一个数列的问题,不妨总结一下数列问题的解决办法

从性质上看,一可以根据逆序对个数和奇偶性与问题的关系,二可以把\(a_i\)排序构造一个新的数列\(\{b_i\}\),再构造一个\(\{c_i\}\)记录\(\{b_i\}\)第i个元素在\(\{a_i\}\)中出现的位置,三是构造数列\(\{b_i\}\),令\(b_i=a_i-i\),四是最长上升子序列的长度和个数与原问题的关系。

从角度入手可以考虑第i个位置,前i个位置,相邻位置,常用办法是微扰法,集合问题可以通过排序转成数列问题

转载请标明出处:双端队列
文章来源: 双端队列
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!