P3643 [APIO2016] 划艇
题目详情 - [Apio2016] 赛艇 - BZOJ by HydroOJ
-
看着个题目以为是变换考虑方向,但想了半天完全没有思路
-
先考虑暴力。设
表示前 个数,第 个数强制选,值为 的方案数 -
容易得到转移方程:
-
这么做显然不行,因为值域太大了,状态根本列不下。考虑离散化。
-
我们先把闭区间变成左闭右开区间后离散化,记
为第 个区间,考虑改变 状态的定义 -
设
表示前 个数,第 个强制选,值在第 个区间内的方案数。转移时我们枚举第一个值在第 区间内的位置 即可转移。 -
如果你这么想你就太 naive 了!
-
我们发现我们完全没有考虑
区间内的填数情况,这些区间里的数要么是在区间 中要么没有选,我们要考虑计算这里面的方案数。 -
引理:从
这些数中选 个数,使得构造的序列非 位单增的方案数为证明:如果没有选择非
位的条件的话方案数显然为 ,即从 中选 位即可。现在新增了选 的条件,我们不妨沿用插板法的思路,把原序列前添加上 位 ,此时如果选择了第 个 ,则等价于在第 位后面插入一个 。 -
有了这个定理,我们就可以列出转移方程:
其中
, 表示 中包含第 个区间的区间个数。组合数上标 是因为我们强制第 位选。 -
这么做还不太够,因为暴力转移这个式子是
的,发现我们可以用前缀和优化,最终可以做到
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?