前三题氵
D
给定一个由 (,?,)
组成的字符串。每个 ?
可以设定为任意括号。求有几种设定方法使得整个是合法括号序列。
套路,dp
E
给定 个两两不相交的长方体,对每个长方体,求有多少个长方体与其有公共面。
有一个可以大幅度优化代码麻烦程度的小技巧:因为坐标范围很小,我们直接把每个长方体拆成 个小立方体看就行。
对于第 个长方体的每个小立方体 ,让它相邻的六个小立方体都统计一下:我的相邻小立方体有来自第 个长方体的。这其实就等价于有公共面。
F
有 个东西类型为 。
类型 的是罐头,无限制,有一个价值。
类型 的也是罐头,需要开罐器,也有一个价值。
类型 的是开罐器,有一个可开罐数量。
只能选 个东西,求最大价值和。
这题比 E 氵
考虑枚举拿的开罐器数量,同时维护此时的最大价值和。
用一个 multiset 保存当前持有的罐头。初始时把最大的 个类型 加入 multiset 并令初始价值和为它们的价值和。(赛时居然把所有类型 的都加入 multiset 了,一定注意是最大的m个)
然后枚举拿的开罐器数量,注意开罐器一定是按照可开罐数量从大到小拿。(如果某次发现上一次的总可开罐数量已经足够开启所有罐头,就 break)
假设这次拿的开罐器可以打开 个罐头,接下来从上一次开罐的结尾开始,再把之后的 个罐头加入 multiset,同时也令当前价值和加上这 个罐头。
最后把 multiset 中多余的罐头去掉。(注意要考虑拿了一些开罐器)这时剩下的就是拿这么多开罐器的答案了。
每次让 和维护的最大价值和取 即可。
G
找出树上有多少个三个点的点组,使得不存在一条简单路径包含这点组内的三个点。
每一个符合要求的三点组 ,一定唯一存在一个结点 ,使得 这三对路径中,每一对路径都存在一个非 的结点重复。(说人话就是从点 往外辐射出去)
因此只需要考虑每一个点 ,统计对应的 个数,加起来就是答案。
而假设固定了点 , 的个数就是从 的每个儿子子树的规模中,任取三个相乘的和。(例如 有 个儿子, 颗子树的规模分别为 ,答案就是 )
如果 的子结点不足 个,对答案的贡献为 。
“任取三个相乘的和” 这个问题可以用 DP 解: 表示前 个元素任取 个数相乘,求和是多少。时间复杂度 序列长度。
因此对于一个固定的结点 ,它对答案的贡献可以以 的复杂度求出, 是以 为根时 的子结点个数。
但是还有一个问题:以 为根时,各子结点的子树规模怎么求?其实做一遍换根 DP 就行。
总复杂度 。
其实这题用到的知识点并不超纲。赛时卡在了如何求出“任取三个相乘的和”上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!