CF 570D
一棵树,每个节点上有一个字母,每次查询点 的 级儿子的字母是否能重排成一个回文串。
trick:压位,只有01的信息(在此题中是奇偶性),可以压成一个 int
来并行计算,这样就可以砍掉一个
用到类似trick的题:由乃的OJ
ARC 127C
给定 ,要求在 的范围内找字典序排名第 小(没有前导零)的二进制数,其中 是以 进制给出的。
首先先假装 存在,这个是不要紧的,令 .
然后数可以分成三类,, 开头的, 开头的,如果 ,那么答案就是 ;否则,若 ,那么就是 开头,然后令 ( 没有了),若 ,说明是 开头, 减去 即可。
由于每次减去 的话是砍掉最高位可以 ,然后 的话就暴力借位,对于每一位考虑最劣情况下借位次数,其数量是 .
trick:对于一个数,每次只有 ,或者每次只有 ,暴力进位/借位次数均摊下来是 的。
AGC 052B
给定一棵树,每条边有一个初始边权和一个要得到的边权,每次可以选择一条边 ,令这条边的所有邻边的权值都异或 .
考虑边权转点权,让边权满足其为相邻点权的异或和,操作变成交换两个点的点权。
随便钦定一个为根,设 为初始时 的点权, 是 期望得到为多少。如果存在 ,满足它们是相同的集合,就有解。
注意到如果确定了一个点的点权,那么其他所有点权都能唯一的确定。
现在钦定 为 到根路径上的边权和(或者说钦定 ),注意到任何一组解都能把所有点权异或 ,得到 的解,所以判断是否有解就判断 的时候是否有解。
现在 确定了,看是否存在 ,满足 和 是相同的集合。
现在继续钦定 为 到根路径上边权和,与 相同,所有可能为答案的 都是 异或上一个 得到的。
那么有解的充分条件就是 ,由于 为奇数,所以可以解出 是多少。
由于这仅是充分条件,那么最后还要 一下是否合法。
trick:由充分(或者必要)条件可以得出答案可能的一种或多种取值,然后暴力判断必要(或者充分)条件是否满足。
AGC 045B
有个 序列,其中有些位置不确定。要确定这些位置,最小化区间 和 出现次数的差的绝对值的 。
作一下前缀和,问题变成使得前缀和的极差尽可能小。先考虑暴力怎么做是不是加边加边并查集,枚举前缀和 的最大值,然后从前往后贪心想使得最小值尽可能大,如果当前能填 就填 ,否则填 .
观察这个贪心,考虑到枚举的 的最大值 之后,最多有一个 变成了 ,因为上界 后又 ,所以从那个位置之后的填法和之前是一样的。所以最大值 之后,最大的最小值最多会 ,故不会更优。
所以只枚举可能的最小的前缀和最大值及其 即可。
trick:先考虑暴力怎么做,然后给暴力剪枝/优化
ARC 128A
初始有 黄金和 白银,接下来 天,在第 天可以选择什么也不做,或者把 黄金换成 白银,把 白银换成 黄金。构造方案使得最终得到黄金最大。
假设现在有 克金子如果在第 天将金子换成银子,紧接着在第 天把银子换成金子,那么 .
- 把限制松一松,一天可以交换多次,发现和原问题等价,交换两次相当于没有交换。
- 把限制紧一紧,一次对换,即在第 天将金子换成银子,紧接着在第 天把银子换成金子。仅允许 .发现和原问题等价, 天金到银, 天银到金,等价于 天金到银, 天银到金, 天金到银, 天银到金... 天银到金。即 对换,等价于 对换。
问题转化成让 克金子,每次可以乘上 ,所以只有 的时候,才选择对换 .
对应回原问题,一笔交易被对换奇数次才相当于做这一笔交易。
trick:限制松一松/紧一紧发现和原问题等价。
思维不好怎么办?第一眼可以看出暴力 dp,设 代表在做完前 笔交易,手里拿的金子/银子的最大克数,转移的时候判断大小,用 来比较就可以。对应了[Code+#4]组合数问题2这道题的 trick,数比较大且运算只有乘除法/次方的时候用 比较大小。
CF 506D
给定一张无向图,每次询问给定 ,求有多少 满足至少存在一条 到 的路径,其颜色均为 .
想不出来的时候就想暴力,然后优化优化,然后尝试平衡复杂度(虽然这题没有把两个暴力拼起来平衡复杂度)
对于每一个颜色开个并查集,会用到的点数只有 个。
然后对于一个询问 ,对其中一个点出边的颜色所在的并查集,看 是否连通,由于 是等价的,所以查询度数 较小的那一边。
如果一个询问询问了多次,可以直接用之前已经得出的答案。
这个复杂度是有理有据的,对于 的点,最多有 个,查询的复杂度为 .
对于 的点,最多查询 次,查询的复杂度为 ,如果把并查集的复杂度看成常数的话总复杂度就是 .
应该还有其他拼暴力的方法,但这个一个暴力就够了。
CF 383E
给出 个长度为 的由小写字母组成的单词,一个单词是正确的当且仅当其包含至少一个元音字母。这里的元音字母是 a 到 x 的一个子集。对于所有元音字母集合,求这 个单词中正确单词的数量平方的异或和。
设总有效字符数为
对于一个集合而言,答案为 包含其中一个字母的单词数 同时包含两个字母的单词数 同时包含三个字母的单词数。
同时包含三个字母的单词数就是完全包含在集合中的单词数,做个高维前缀和就可以了。复杂度
只看前两项, 为集合元音字母集合为 时的答案,从 转移而来。复杂度
有更简单做法:
经典套路正难则反:与集合有交的集合数 总集合数 与集合不相交集合个数 总集合数 其补集的子集出现次数。
这样一遍高维前缀和就ok了。
CF 715C
给定一棵树,边权 。给定一个数 ,保证 .
对于一对有序的不同的顶点 ,他沿着从顶点 到顶点 的最短路径,按经过顺序写下他在路径上遇到的所有数字(从左往右写),如果得到一个可以被 整除的十进制整数,那么就认为 是有趣的点对。
求有趣的对的数量。
树上满足某种条件的路径个数要想到点分治
点分治,对于一个分治中心,求出子树中每个节点自上而下的数字 ,匹配上另一个自下而上的数字 ,其深度为 ,要满足 ,开个 map
统计就可以了。时间复杂度 2log(map
)或者 1log(unordered_map
)
CF 555E
给定一张 个点 条边的无向图和 组点对 ,现在要给每条边定向成有向图。
询问是否存在一种定向方案使得所有 都能到达 .
点对之间是否存在可达路径 Tarjan(不要想支配树了啊喂你又不会建支配树)
按照边双缩个点,缩出来一棵树。一个边双内的点对肯定能互相到达,连出来一个环就可以。现在只有边双之间的点对,看看是否能满足所有的 ,随便钦点一个根,有边既要朝向根又要朝向叶子就不合法,用个树上差分解决。
自己瞎编的边差分竟然是麻烦了,点权代表点和父亲的边权,边差分作子树和更好写。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?