CF1608F MEX counting

题意

给定 n,k 和序列 b1n,计数序列 a1n 使得 i[1,n],mexj=1i{aj}[bik,bi+k]

数据范围:1bin2000,0k50

题解

永远做不出简单题。我是弱智。

考虑递推过程中维护 mex 的变化,那么需要在每个 i 处决策 mex 增加多少,那么考虑在某一个数变成小于 mex 的位置再去决策它的具体值。记 fi,j,k 表示前 i 个数,mexj,有 k 个数大于当前的 mex 的方案数。写一下转移:

fi,j,k=fi1,j,k1+(j1)fi1,j,k+t=0j1p(k+pp){pjt1}(jt1)!fi1,t,k+p

发现状态数 n2k,转移怎么也不能做到 O(1)。于是我就极限降智。

怎么优化呢?注意到比较恶心的是 p,主要是我们虽然知道转移从 tj 的过程中一定要用未决策的数去填满 tj1 个位置,但是不知道具体有几个数,怎么把这些数放进去。然后你发现与这边巨大多的式子形成鲜明对比的是你在把数延迟决策的时候机会什么都不干。于是你考虑改一改状态:gi,j,k 表示前 i 个数,mexj,大于当前 mex 的数分为 k 类的方案数。于是转移就是:

gi,j,k=(j+k)gi1,j,k+gi1,j,k1+t=0j1(k+jt1jt1)(jt1)!gi1,t,k+jt1

这个转移随便拆一下做个前缀和就 O(1) 了。

posted @   kyEEcccccc  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示