NOI2020
Day1
美食节
-
这个题一看就感觉是个矩乘,因为数据范围这么大还和走路有关
-
为了保证一次只能走一格的规则,我们需要先处理这个边权
-
这个边权
太小了,考虑直接拆了 -
最显著的拆法是将边拆成
段,前 段的边权为 0 ,第 段的边权为 ,代表走完这条路能取得的收益 -
那么现在有
个点,每次走一条边,问走 条边回到原点能得到的最大收益(暂时不考虑美食节) -
这个就直接建一个系数矩阵,复杂度是
-
再考虑美食节的影响,美食节没办法在矩乘的中间处理,又可以发现美食节的数量也是很小的,考虑每两个美食节之间进行矩乘转移,到达一个美食节的时间时暴力在矩阵上修改
-
那么复杂度是
,这不太优秀 -
我们最终要求的是到原点的最大值,所以实际上我们只用保留第一行的元素,也就是一个长度为
的序列 -
那么一个显然的优化就是预处理出
二进制下的所有 的矩阵,每次用序列和矩阵相乘,这样复杂度就可以降为 了 -
那么最终的复杂度就是
,可以通过
总结
-
矩乘 + 二进制优化
-
题目本身还是比较好想的,注意矩阵赋初值时不合法的地方一定要赋值成负无穷,而不是 0 ,不然你就会和我一样调半天不知道哪有问题
命运
-
首先肯定是考虑树形 dp
-
可以发现对于对于每个点的每一条以这个点为下端点的链,我们只关心上端点最深的链
-
通过这个,我们可以发现对于一个点和它的子树,我们只关心祖先中最深的还没满足条件的点的深度
-
设
表示下端点在 子树中,没有满足条件的上端点中最深的节点的深度为 时的方案数 -
特殊的,
表示全部满足条件时的方案数 -
现在考虑合并上子节点的答案
-
假设
,那么 -
假设
,那么 -
写成前缀和的形式,就会发现要么是常数项,要么是有关于下标
,那么线段树合并就可以了
总结
-
树形 dp + 线段树合并
-
实际上这个树形 dp 才是这个题目真正的难点,线段树合并还是比较好写的
时代的眼泪
-
注意到每一个位置的纵坐标组成了一个排列,说明值域
-
题目抽象出来,其实就是要求一个区间在一个值域中的正序对的个数
-
考虑用序列分块套上值域分块来做这个东西
-
将贡献分成整块之间,整块和散块,散块之间的贡献,分别去解决就可以了,整体的思路还是比较好想的
-
你问我代码?下次一定
Day2
制作菜品
-
首先考虑
的情况,一定有答案,因为一定有一个位置的数字 ,那么拿掉这个,再从最大的身上拿掉剩下的,就还剩 个原材料和菜品,又是一个相同的子问题,递归下去一定有解 -
然后会发现
时也一定有解 -
再考虑
时,此时仍然可以考虑拿走一个 的原材料,然后从最大的里面拿走剩下的,通过计算可以证明一定存在这种方案,也就是变成了相同的子问题,最终可能会剩下 1/2 个原材料,仍然符合题目的要求,所以 的情况也一定存在解 -
最后考虑
的情况,可以发现无法再按照上面的思路去思考了,考虑将这种情况分成两个 的情况,也就是构造一组子集 ,满足 ,剩下的自然构成另一个子集,那么这两个子集分别对应两个 ,也就是如果能构造出这样的一种子集,一定有解 -
考虑将这个式子转换一下,
,这个显然可以用 01 背包来判断有没有解,因为我们只需要知道是否有解,所以拿bitset
优化一下,复杂度就是 -
最后还需要考虑证明如果无法构造出这样的集合,就无解,本人目前还没办法证明,
不过你在考场上谁管你证不证明啊,毕竟富贵险中求
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!