P3643 [APIO2016] 划艇

[APIO2016] 划艇 - 洛谷

题目详情 - [Apio2016] 赛艇 - BZOJ by HydroOJ

  • 看着个题目以为是变换考虑方向,但想了半天完全没有思路

  • 先考虑暴力。设 dpi,j 表示前 i 个数,第 i 个数强制选,值为 j 的方案数

  • 容易得到转移方程:

    dpi,j={k=0i1l=1j1dpk,lj[li,ri]0otherwise

  • 这么做显然不行,因为值域太大了,状态根本列不下。考虑离散化。

  • 我们先把闭区间变成左闭右开区间后离散化,记 [bi,bi+1) 为第 i 个区间,考虑改变 dp 状态的定义

  • dpi,j 表示前 i 个数,第 i 个强制选,值在第 j 个区间内的方案数。转移时我们枚举第一个值在第 j1 区间内的位置 k 即可转移。

  • 如果你这么想你就太 naive 了!

  • 我们发现我们完全没有考虑 (k,i] 区间内的填数情况,这些区间里的数要么是在区间 j 中要么没有选,我们要考虑计算这里面的方案数。

  • 引理:从 [x,x+L1] 这些数中选 n 个数,使得构造的序列非 0 位单增的方案数为 (L+nn)

    证明:如果没有选择非 0 位的条件的话方案数显然为 (Ln),即从1,2,3,,L 中选 n 位即可。现在新增了选 0 的条件,我们不妨沿用插板法的思路,把原序列前添加上 n0,此时如果选择了第 i0,则等价于在第 i 位后面插入一个 0

  • 有了这个定理,我们就可以列出转移方程:

    dpi,j={k=0i1l=1j1(L+m1m)×dpk,lj[li,ri]0otherwise

    其中 L=bj+1bjm 表示 (k,i] 中包含第 j 个区间的区间个数。组合数上标 1 是因为我们强制第 i 位选。

  • 这么做还不太够,因为暴力转移这个式子是 O(n4) 的,发现我们可以用前缀和优化,最终可以做到 O(n3)

posted @   FOX_konata  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示