拉格朗日插值优化值域 dp
前言
-
主要是我对省选 2022 D1T2 一直耿耿于怀,所以就有了这一篇文章
-
感觉这一类题目似乎都挺套路的
-
学习不久,肯定有很多错误,望轻喷
前置知识
-
拉格朗日插值:
,复杂度为 -
一般的我们会用
这样的点值来做插值,原式就可以转变成 ,预处理出阶乘,复杂度就可以做到 了 -
多项式做前缀和指数+1 ,多项式相乘指数相加,多项式相加指数取最大......
问题引入
-
首先设计 dp
-
设
表示前 个学校的最大值为 的方案数, 表示一个都没选 ,转移式:- 当
- 否则,
- 当
-
可以发现
是一个分段函数,拉格朗日插值可以为完整不分段的多项式插值 -
因此我们考虑将值域
分成若干段 左闭右开 的区间,使得每一段区间都是可插值的 -
那么
就是断点,将所有的这些点放在一起离散化,对于 每次求出 个点值即可,一共只有 个这样的区间 -
是一个常数多项式,每次转移最多是做了以一个前缀和,指数加一,所以 的次数必然最大为 ,插 个点值即可 -
因此就是对于每一个区间维护前
个点值,注意到这里最终插值实际上插的是一个范围,因为我们要维护区间和,所以插出来的值要是整个区间的和,所以我们维护前 个点值的时候要维护真正的 的值的相对于区间的前缀和,具体可以看看代码理解 -
一开始还 T 成了 90 ,还以为被卡常了,后来发现没开 O2
-
首先设计 dp
-
首先需要观察到对于最右边的最大值,左边和右边其实是两个独立的新的子问题
-
那么考虑根据这个性质建立 dp 方程
-
设
表示在范围内最大值 的方案数 -
那么每次枚举一个可以成为最大值的位置,然后枚举最大值,递归求解
-
因为对于一个区间只有
个满足条件的位置,所以实际上的状态很少,写到这里就拿到了前 50 分 -
我们将每个可能涉及的范围用一个数字来表示这个状态,设
-
设状态数为
,复杂度就是 -
可以发现这里的复杂度瓶颈在值域
-
对于
的时候,可以发现 其实是个一次函数 -
考虑每次合并,可以发现长度为
的区间, 实际上是一个 次多项式 -
所以次数不会大于
,那么我们考虑像上一题一样用拉插来做 -
仍然先将区间分成一个个左闭右开的区间,对于每个区间做一次
-
首先对于每个状态求出前
个插值,然后再对于每个状态做拉插,用 来存前缀和即可 -
T 成 95 了,不想卡常所以所以直接特判过去了
前言
我是傻逼
正题
-
首先考虑第一问
-
考虑先确定一个最小值
,那么最大值的范围就是 ,设 表示范围在 的路径的个数 -
那么答案实际上就是
-
设
,那么答案就是 -
用树形 dp 可以 解决 -
仍然考虑按照值域分成一段段左闭右开的区间,这样每一段树形 dp 的时候都是完整的函数,可以进行拉插
-
最后大致的分析一下多项式的指数,可以发现
的指数最多就是 -
权值也是一样的做法,不过因为乘了一个等比数列,所以指数就是
-
感觉这个题最多紫啊
-
设
表示前 个数,值域为 的答案 -
-
发现这个式子有一维是值域,极大无比,感觉这种情况要么考虑矩乘要么就是拉插吧
-
显然是拉插啦,考虑多项式的指数
-
可以发现
-
可以发现后面的多项式整体右移了一位又做了前缀和,所以指数 +2
-
所以对于
的指数是 ,求出 个点值然后直接插值就可以了
总结
-
大概解决一类 dp ,有一维是值域且非常大,
很小,复杂度猜测为 左右,具有选择值域中的一个数这样的特征 -
首先写出 dp 的式子
-
然后考虑优化值域这一部分
-
一般的将区间分成一段段左闭右开的区间得到完整的函数,然后分析指数,考虑拉插
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探