打打打打打字机|

realFish

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

CF1383E 题解

题意

传送门

给定一个长度为 n 的 01 串 a。在一次操作中,你可以选择任意一个 i[1,|a|),令 ai=max(ai,ai+1),然后将 ai+1 删除。你可以进行不超过 n1 次操作,问一共能得到多少种 01 串,答案对 109+7 取模。

1n106

题解

若对操作的序列计数,此题难以处理。我们通过一些转换,对可以得到的串计数。

利用 1 将串划分,记录每段 0 的数量。如 001010011 就是 {2,1,2,0,0}。那么可行的操作就是将一个大于 0 的数减 1,或删除一个不在头尾的 0。于是一个串与一个序列一一对应。下面我们对序列计数。

头尾不删,则可以扔掉,最后乘上系数 (a1+1)(an+1)。此时可知一个长为 m 的序列 b 可行的充要条件:存在 i1<i2<<im 满足 j[1,m],bjaij。用类似子序列自动机的方式判断。每次向后找到第一个大于等于 bj 的位置并移动指针。

然后可以 dp。设 fi 表示指针在 i,每次枚举下一个放的数。则有 fi=j<ifj+max(0,aimaxk=j+1i1ak)。单调栈可做到 O(n)

本文作者:realFish的博客

本文链接:https://www.cnblogs.com/fish07/p/17154677.html

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

posted @   realFish  阅读(22)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起