经典 trick 选记
图论
- 有关于树/DAG 的构造等,可以考虑从叶子/入度为零的节点开始删点。
- 有关于 Floyd 的题目,观察是否满足矩阵乘法结合律,从而使用矩阵快速幂加速。
,其中 。类似 trick 的题目:CF1062E。- 考虑 dijkstra 每个点只会经过一次,通过其距离单调递增的性质,来给一张图定向成一张 DAG。
- 当题目给定一个网格时,且有对于一整行、一整列的操作时,考虑把第
行向第 列连一条边权 的边(特殊地, ),构造出一二分图。类似 trick 的题目:ARC083F。 - 看到有关于“次数”限制时,考虑拆点,跑网络流。
- 考虑让一些特殊节点成为树的根,比如重心。
- 对于一棵树上有不同类型的点(比如黑/白点),考虑虚树。
- 对于一些具有可减性的信息,考虑建图作为边权。
- 除节点编号外还出现了“时间”一类的信息考虑分层图。
- 树形 dp 遇到要保存某个子孙信息时,不妨逆向考虑保存祖先信息,即
转换成 。 - 考虑把一棵树拆成一条链上面挂了好几棵子树,或者一张图拆成一条链上面挂了好几个环。
- 遇到奇偶、男女、
、黑白之类的信息,考虑二分图/并查集/网络流。 - 无向图的 dfs 树不存在横叉边。
- 求完全图最小生成树,且边权有一定规律时,考虑 Boruvka 算法。类似 trick 的题目:CF888G。
。类似 trick 的题目:P5304。- 当一个图既有点权又有边权时,考虑把点权拆到边上,或者把边权拆到点上。
- 判断树上两点是否为祖先关系时,考虑从 dfn 序入手。类似 trick 的题目:P5901。
- 遇到有关于“匹配”的问题,除了网络流外,还可以建基环树森林,对应每条边与每个点一一对应。类似 trick 的题目:ARC083F。
- 差分约束只有非负/非正权边时,考虑 tarjan 缩点,判断每个强连通放了内是否有正/负权边,然后 toposort。类似 trick 的题目:P3275。
- 遇到有一些边至少/恰好走一次考虑欧拉路。类似 trick 的题目:P6628。
- 对于树上任意
个点 满足 。 - 对于复杂度和节点度数相关,考虑根号分治/三元环计数的 trick。类似 trick 的题目:P3547。
- 如果对于某个节点
需要计算他与每一个节点 相关值的(最值/和)信息,考虑先将一条链 劈成 和 ,对后者先自下而上汇总,再对于前者自上而下传。类似 trick 的题目:AtCoder Code Festival 2017 Final J。 - 如果
,则 必然有一个节点在 的轻子树中。 个点的竞赛图三元环数量为: 。- 对于一个无向图,设
为距离点 最远的点的距离,则该图的直径为 ,有结论为 。类似 trick 的题目:CF1804F。 - 一个无向图的所有环的公共节点只有至多两个。
- 当每个点最多只有两条出边时,考虑三角剖分图。
- 一个二分图的所有的最大匹配方案中必然有一个公共点,即删去这个点后最大匹配数减一。
- 竞赛图缩点后是一条链。
- 如果我们知道竞赛图每个点的入度 or 出度,则可以确定整张竞赛图的相对顺序。
ds
- 有关于维护下标大小信息的合并,可以借助线段树上本身的左儿子下标小于右儿子下标简单处理。
- 维护一个三元组
的信息,看看是否能拆成 的形式更易维护。 - 树剖的边转点:钦定边
的编号为 ,进行修改/查询链 时等价于查询 。 - 从作用层面上来讲,主席树
不带修树套树。当一道题树套树意义下做法显然时,考虑将其变为主席树。 - 对于维护
一类的查询时,对第二位排序,维护第一维即可。 - 一些修改较为复杂时,不妨采用矩阵维护。类似 tirck 的题目:LOJ2980。
- 对于树上,链加单点求和
单点加,子树求和;单点加链求和 子树加,单点求和。可以把暴力树剖的 优化到 。 - 遇到“出现次数”,考虑根号分治。
- 数颜色数往往采用记录
然后数点的方法。 - 当遇到删除操作时,考虑线段树分治。
- 有关于最值/比较大小的问题(包括但不限于 ds 和 dp 问题),考虑丢到笛卡尔树上去考虑。
- 对于查询第
小的问题,如果存在简单的 做法,但 很大时,考虑随机二分。类似 trick 的题目:P5984。 - 对于树上,如果要快速统计某个点所有儿子的信息,考虑开一个数据结构保存其所有轻儿子信息,则在树剖时,由于不会经过超过
跳重链,所以修改轻儿子的复杂度可以接受;对于重儿子,再开一个数据结构维护所有点的信息,在查询时把他和轻儿子丢到一个数据结构里计算即可。类似 trick 的题目:CF1172E,P5314。 - 当一些东西和为定值时,考虑对其进行根号分治。
- 在有向树上通过 toposort 做线段树合并复杂度是对的。例子:P8959。
dp
- 如果遇到询问形如:规定某个物品不能用之类的,可以考虑前后缀分别 dp,然后询问时在中间再做一次 dp(其实与杂项中的第
条类似)。 - 数位 dp 时可以考虑在数位上做区间 dp(普通数位 dp 本质上是在数位上做线性 dp)。类似 trick 的题目:P9129。
- 遇到“强制选”时,同样考虑前后缀 dp。类似 trick 的题目:P1973。
- 对于 dp 题,思考:哪些状态是有用的。
- 当优化 dp 状态却无从下手时,考虑 dp 方程的单调性。
- 当 dp 转移方程和因数/倍数关系有关时,考虑将其写成迪利克雷卷积的形式,观察其积性/进行反演。
杂项
- 如果某道题直接 dp/贪心比较困难,考虑是否可以进行反悔贪心。
- 遇到比较两集合、两序列的情况时,考虑哈希;如果需要动态维护哈希值,那么需要构造出一种优秀的哈希函数。类似 trick 的题目:P5278。
- 对于类似于“删除”一类等操作直接做较为困难时(如模非素数意义下的除法、线性基相减)等,考虑维护前/后缀的值。类似 trick 的题目:CF543D。
- 看到一个变换
,考虑是否能拓展到 。 - 根号分治是一种很重要的复杂度分析方法。
- A296010,看到
考虑复杂度是否与拆分数相关。 - 考虑转换:存在一个满足
所有都不满足。 。 。- 字符串题考虑:翻转、拼接、插入。
- 当模数不为素数时,考虑质因数分解然后最终用 crt 合并答案。类似 trick 的题目:P2480。
- 遇到
,考虑转换成 和乘方处理。类似 trick 的题目:CF1106F。 - 对于任意正整数
和 ,必然存在一个正整数 使得 和 的 进制数在第 位不同。类似 trick 的题目:P5304。 - 对于形如“选择若干个数满足什么条件,且使得选择方案字典序最小”的一类问题,考虑从小到大枚举数,判断是否可以加入。
- 遇到
,考虑将其分为 个周期性问题。 - 对于杂项
的拓展: 。类似 trick 的题目:CF1093G。 - 对于“在一个集合里随意交换”,往往将其抽象成一个置换环。类似 tirck 的题目:P8189。
- 对于线段上点的运动往往转换成在二维平面上折线的轨迹。类似 trick 的题目:P9018。
- 对于“给定一些数量关系判断是否发生矛盾/求值”一类的题目,考虑将一类关系看出修改,一类关系看出询问。
- 对于求一个
序列的最长不下降子序列:将 置为 , 置为 ,则等价于求新序列的最大前缀和。 - 最大子段和性质:不存在一个前缀或一个后缀为负;不存在一个紧贴在其之前或紧贴在其之后的字段为正。类似 trick 的题目:P5369。
- 当恰好
个不好算时,考虑转换成钦定 个,然后容斥;特殊地,例如求 的个数,不妨转换成 为 的倍数 。类似 trick 的题目:P4926。 。类似 trick 的题目:P9753。 。类似 trick 的题目:CF55D,CF1359E。- 看到平均数
,考虑将所有数都减掉 ,那么就变成了和 的问题。类似 trick 的题目:ARC104C。 - 考虑几何意义。
,一个经典应用是 ,则 。- 当
是偶数时, 。类似 trick 的题目:CF1493E。 - 异或最大/最小:考虑 01-Trie/线性基。
- 对于排序、比较大小、交换一类的问题,往往考虑从
序列入手,即钦定一个 ,记 的数为 , 的数为 。 - 对于期望
,考虑记 ,有 。类似 trick 得题目:CF1523E。 - 对于令“所有数相等”一类的询问,考虑对依据题目给定的变换连边,则问题变成了求那几个数在树上的 lca。类似 trick 的题目:CF1797E。
。- 对于
或 的形式,当随 增大时 不增大,找出 的表达式, 时即为答案。 。- 对于一些比较奇怪的贡献(比如说
)考虑其组合意义。 - 把一个
拍扁成 ,则我们有 。
本文作者:lsj2009
本文链接:https://www.cnblogs.com/lsj2009/p/17668670.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步