2024/9/20

news/2024/9/24 23:22:30/文章来源:https://www.cnblogs.com/ddxrS/p/18430309

拉格朗日插值

通过 \(n+1\) 个点 \((x_1,y_1),(x_2,y_2),\dots,(x_{n+1},y_{n+1})\) 唯一确定一个 \(n\) 次多项式。

考虑构造 \(n+1\) 个式子,对于第 \(i\) 个式子满足当 \(x=x_i\) 时值为 \(y_i\),当 \(x\not=x_i\) 时值为 \(0\),将这 \(n+1\) 个式子加起来就可以得到这个 \(n\) 次多项式。

也就是说我们有 \(f(x)=a\cdot \prod_{i\not=j}(x-x_j)\),然后过 \((x_i,y_i)\),于是 \(a=\frac{y_i}{\prod_{i\not=j}(x_i-x_j)}\),所以 \(f(x)=y_i\cdot\prod_{i\not=j}\frac{x-x_j}{x_i-x_j}\)

给定 \(x\)\(f(x)\),时间复杂度 \(O(n^2)\)。当 \(x_i\) 连续时可以预处理出前缀积、后缀积、阶乘来 \(O(n)\) 计算。

CF995F Cowmpany Cowmpensation

*动态规划,dp 优化

题目大意:

树形结构,给每个节点分配工资(值域在 \([1, d]\)),子节点不能超过父亲节点的工资,问有多少种分配方案。

数据范围 \(1\le n\le 3000,1\le d\le 10^9\)

思路:

先列出朴素的 dp,设 \(f_{u,i}\) 表示在节点 \(x\) 的工资为 \(i\) 的方案数,我们有:

\[f_{u,i}=\prod_{v\in son_u}\sum_{j=1}^{i}f_{v,j} \]

\(g_{u,i}\)\(\sum_{j=1}^{i}f_{u,j}\) 可以把 dp 优化到 \(O(nd)\),但是 \(d\) 很大,无法通过。

但是,可以发现,\(g_{u,i}\) 是一个不超过 \(siz_{u}\) 次的多项式,证明如下:

  1. \(u\) 是叶子时,\(g_{u,i}=i\) 是一个 \(1\) 次式。
  2. \(g_{u,i}-g_{u,i-1}=\prod_{v\in son_u}g_{v,i}\),这个式子的次数是所有乘起来的式子的次数和,为 \(siz_u-1\)。所以 \(g_{u,i}\) 的次数就是 \(siz_u\)

所以,对于每个 \(1\le i\le n+1\) 可以用 \(O(n^2)\)\(g_{1,i}\) 的值求出来,然后来一边拉格朗日插值就可以求出 \(g_{1,d}\) 了。

APIO2016 划艇

*动态规划,dp 优化

题目大意:

\(n\) 个位置,每个位置要么不选要么在 \([a_i,b_i]\) 中选一个数,求有多少种方案能使得选出来的数是单调上升的。

数据范围 \(1\le n\le 500,1\le a_i\le b_i\le 10^9\)

思路:

同样是列出朴素的 dp,设 \(f_{i,j}\) 表示第 \(i\) 个数选 \(j\) 的方案数,我们有:

\[f_{i,j}=\sum_{k=0}^{i-1}\sum_{p=1}^{j-1}f_{k,p} \]

预处理二维前缀和可以优化到 \(O(n\max(a_i,b_i))\),但 \(\max(a_i,b_i)\) 很大。

我们还是令 \(g_{i,j}=\sum_{k=1}^{j}f_{i,k}\),转移的式子变为 \(f_{i,j}=\sum_{k=0}^{i-1}g_{i,j-1}\)。将区间分割开后 \(g_{i,j}\) 同样是一个 \(i\) 次多项式,对于每段分开跑一次拉格朗日插值就可以求出答案。


UVA1106 Machine Works

*动态规划,斜率优化

思路:

先将所有机器按照 \(D_i\) 排序。

考虑 dp,设 \(f_i\) 表示当前买入第 \(i\) 台机器能的得到的最大收益,于是有:

\[f_i=\max(f_j+G_j\times(D_i-D_j-1))-P_i+R_i \]

\(\max\) 的括号打开,并整理可得:

\[f_j-G_j\times(D_j-1)=-G_j\times D_i+P_i-R_i \]

\(f_j-G_j\times(D_j-1)\) 看成 \(y\)\(-G_j\) 看成 \(k\),可以直接用 cdq 或李超线段树来维护。


CF868F Yet Another Minimization Problem

*动态规划,决策单调性

题目大意:

给定一个序列 \(a\),要把它分成 \(k\) 个子段。每个子段的费用是其中相同元素的对数。求所有子段的费用之和的最小值。

数据范围 \(2\le n\le 10^5,2\le k\le \min(20,n)\)

思路:

\(f_{i,j}\) 表示前 \(i\) 个数分成了 \(j\) 段的最小费用,于是有 \(f_{i,j}=\min_{k=1}^{i}(f_{k-1,j-1}+calc(k,i))\),其中 \(calc(k,i)\) 表示区间 \([k,i]\) 的费用。

我们发现,在 \(j\) 固定时,dp 是具有单调性的。假设 \(i\) 往右移一次,有 \(calc(k,i+1)=calc(k,i)+\sum_{p=k}^i[a_p=a_i]\)。可以发现,当 \(k\) 越往左,这个增量就越大。

也就是说,对于两个 \(f_{u,j-1}+calc(u,i)\)\(f_{v,j-1}+calc(v,i)\) 其中 \(u<v\),若我们把 \(i\) 往右移一次,前一项值不变,后一项 \(calc(u,i)\) 的增量一定不小于 \(calc(v,i)\) 的增量。所以,当 \(i\) 往右移动的时候,最优决策点一定会增加。

\(j\) 那一维放在外面枚举,里面就可以分治来求解了。


APIO2016 烟火表演

*动态规划,slope trick

题目大意:

给定一棵有根树,边有边权。你可以随意修改边的边权,代价为修改前后边权的差的绝对值。求出最小的代价使得从根到每个叶子节点的距离相等。

数据范围 \(1\le n\le 3\cdot10^5\)

思路:

先列出朴素的 dp 式子,设 \(f_u(i)\) 表示在节点 \(i\) 的子树内所有叶子节点的距离为 \(i\) 的最小代价。那么对于 \(u\) 的一个儿子 \(v\),设这条边的边权为 \(w\),那么:

\[f_u(i)=\min\{f_v(j)+\mid w-i+j\mid\} \]

若令 \(g_v(i)=\mid w-i\mid\) 那么贡献函数就是 \(g_v(i-j)\),可以发现 dp 转移式实际上是两个函数的 (min,+) 卷积。

又因为,\(g_v(i)\) 是下凸的绝对值函数,且叶子节点是下凸函数,所以可以归纳出 \(f_u(i)\) 也是下凸函数。

而我们要求的答案就是这个函数斜率为 \(0\) 的那一段,假设这一段是区间 \([L,R]\)

那么每次的 (min,+) 卷积就相当于:

  • 保留 \(L\) 左边的线段,并将他们上移 \(w\)
  • 插入一条斜率为 \(-1\) 的线段。
  • 将区间 \([L,R]\) 右移 \(w\)
  • 大于 \(R\) 只需要保留一条斜率为 \(1\) 的射线。

每两个拐点之间斜率相差 \(1\),所以我们只需要记录下每条线段之间的拐点就可以还原这个函数。

实现可以用可并堆来维护。


其他题目

  • ABC275EX Monster (slope trick)
  • NOI2007 货币兑换 (斜率优化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803103.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程课程第三次作业

软件工程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13261作业目标 分析学生们的需求,设计一个app原型解决他们的问题学号 072208130合作伙伴 052205144张诗悦使用figma设计原型,原型链接:https://www.figma.…

大文件去重

若文件存的字符如下图,要求进行去重可将数据存入HashSet,如下,但如果文件很大,大于虚拟机内存的话,会报异常java.lang.OutOfMemoryError: Java heap spaceHashSet set = new HashSet();File file = new File("E:\\aa.txt");BufferedReader reader = new Buffere…

9月13日关于数组存储数据

在题目中要求建立数组来存储项目信息,储存的内容包括String、int、boolean、double等各种不同类型,刚开始我还处于建立普通数组要不是int【】要不是string【】,越琢磨越不对劲这样并不能存储不同类型的数据,但是数据又需要统一存取,网上又没有这么简单的讲解,也是被这个简…

9.24日总结

今日上学配置了Node.JS的环境变量,并应用VScode进行JavaScript的相关学习应用 其中

9月11日toString重载方法的使用

在编辑过程中我经常会写一部分调试一部分,至少知道哪里有错能够及时改正,在编写时发现studentManger中的打印出来的是地址,而不是自己想要的内容,经过查询是需要写toString来重载输出利用这样的方法,一是可以正常打印出自己想要的内容,而是可以根据一个参数打印出所有的信…

软件工程作业——结对项目

这个作业属于哪个课程 22级计科12班这个作业要求在哪 作业要求这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序成员姓名 学号 GitHub地址吕宏鸿 3122004446 结对项目宋观瑞 3122004402 结对项目1.PSP表格PSP2.1 预估耗时(分钟) 实际耗时(分钟)计划 10 5* 估计…

9月10日循环条件的结束

在测试编程中涉及到输入错误要重新返回UI界面,但是我写的总是输入不管是对还是错都会直接结束程序,完全不符合要求,经过整理思路,查询代码结构,此处应该设计为双层循环外部为while,内部为witch case语句,当输入为1时执行case==1;经应该是执行生产计划类然后跳出witch条…

IDEA更改远程git仓库地址

前言 我们在使用IDEA开发时,一般会配置好对应的git仓库,这样就比较容易对代码进行控制以及协同开发。但有时候,我们远程的仓库地址由于这样那样的原因,需要迁移(这在爱折腾的企业是常有的事情)。那么,我们该如何在IDEA中更新远程仓库地址呢? 如何设置 首先,我们点击上…

vue3开发中易遗漏的常见知识点

组件样式的特性 Scoped CSS之局部样式的泄露 示例(vue3): 父组件: <template><h4>App Title</h4><hello-world></hello-world> </template> <script> import HelloWorld from ./HelloWorld.vue;export default {name: App,compo…

PasteForm最佳CRUD实践,实际案例PasteTemplate详解(一)

本文将介绍soft.pastecode.cn出品的PasteForm,PasteForm是贴代码使用Dto思想实现的CRUD的一个组件,或者说输出一个思想! 为啥我觉得是最佳的CRUD呢?先结合你的实际项目解答下以下问题: 1.如果有一个系统,有100个表,你的管理端需要多少页面?别和我说100个表很多,需求复…

RTE大会报名丨 重塑语音交互:音频技术和 Voice AI,RTE2024 技术专场第一弹!

Voice AI 实现 human-like 的最后一步是什么?AI 视频爆炸增长,新一代编解码技术将面临何种挑战?当大模型进化到实时多模态,又将诞生什么样的新场景和玩法?所有 AI Infra 都在探寻规格和性能的最佳平衡,如何构建高可用的云边端协同架构?AI 加持下,空间计算和新硬件也迎来…

彻底搞懂回溯算法

1.回溯算法的核心思想 回溯算法的核心思想是:尝试+记录+回退。 先尝试一种选项,在选择该选项的前提下继续寻解,如果最后寻解成功,则记录这个解,否则不用记录,然后再回退到选择该选项前的状态,改为尝试其它选项再继续寻解,判断其它选项是不是解。 2.回溯算法的关键点 回溯…