OI小技巧

  • 一个正整数的所有质因子中大于其算术平方根的最多有一个。
  • 求中位数时可以考虑枚举 \(x\) ,将小于 \(x\) 的设为-1,将不小于 \(x\) 的设为+1,若满足一些数的和大于0,则存在一个满足中位数为 \(x\) 的集合。
  • 求重心的3种方法:1.直接dfs一遍找到 2.沿着重链走 3.从整棵树dfs序的中点(该点一定在重心子树中)向上找。
  • 如何判断树上两条链的并是否仍是链?从两条链的四个端点中选出两个形成新链,然后判断剩下两个点是否在该链上。
  • 求K大值可以考虑使用堆或者二分答案。
  • 求偶数/奇数的方案数可以考虑行列式。
  • 一个DAG有一棵以A为根的外向树等价于除A外每个点的入度至少为1。内向树类似。
  • 处理树上问题不要忘记点分治这种方法。
  • \(k\) 次方问题可以这样维护:1.用第二类斯特林数拆成组合数,从而有很好的组合意义,最后合并 2.直接组合意义,即选择可重的 \(k\) 个位置 3.同时维护 \(0,1,2,\cdots,k\) 次方的答案,用二项式定理合并。
  • 数位dp时可以枚举所求数和上界的最长公共前缀从而消去对后续位置的限制。这样做后在dp时就完全不用考虑上界的问题了,减少了麻烦的讨论。
  • 任何强连通分量都可以通过不断进行如下步骤得到:假设当前强连通分量点集为 \(S\) 。找到一条路径 \(u→p1→p2→p3→⋯→pk→v\) ,满足 \(u,v∈S\) ,然后将 \(p_{1∼k}\) 放入 \(S\) 中。
  • 对于这样一类问题:给出一张图,求满足要求的排列个数,其中要求指排列中相邻的两个数在图中没有边。做法是直接容斥,转化为对所有 \(i\) 求钦定排列中恰好有 \(i\) 条链(链中的边是图上的)的方案数。
  • NFA转DFA方法:对NFA的每个点集都建新点(即有 \(2^{|V|}\) 个点),转移边按照NFA原转移边建立即可。
  • 二分图最大匹配,最小点覆盖以及最大独立集三者只需知道一个其他两个也能知晓。
  • 增量法是构造的一种非常重要的方法。
  • 构造题可以考虑先获得某个初始局面,然后根据该初始局面调整得到目标局面。
  • 如果需要在某条件下最大化某个值,可以先忽略该条件求出最大值,此时可能已经满足了条件。
  • 一类经典贪心:有 \(n\) 个东西,第 \(i\) 个有两个参数 \(a_i,b_i\) 分别表示要先花 \(a_i\) 元买才能获得 \(b_i\) 元,问能否全部买完。贪心策略是先处理 \(a\le b\) 的情况,按照 \(a\) 升序处理;然后处理 \(a>b\) 的情况,按照 \(b\) 降序处理。
  • 有时候打表/爬山看起来不靠谱,但仍然可以试试。
  • 博弈论有时要求先手最大化得分,后手最小化得分,此时可以尝试二分答案。
  • 解题遇到瓶颈时,可以将条件和所求的东西用数学语言进行表达,从而使得思路更清晰。
  • 处理求多项式模 \(c\) 同余 \(a\) 的项的系数之和时要么考虑单位根反演,要么考虑对 \(x^c-1\) 取模。
  • 对于01序列等类似问题,可以考虑画出折线图,即从左到右考虑,遇到0往上走,遇到1往下走。
  • 奇怪的同构类题目一定不要忘记burnside引理这一强力工具。
  • 树上两路径相交当且仅当至少一条路径的lca在另一条路径上。
  • 数据结构题不仅可以考虑对序列分块,也可以考虑对操作序列分块。
  • dp优化时刷表和填表两种方式都要考虑,可能会有不一样的收获。
  • dp优化时不要过于执着于优化状态数,因为最终复杂度是有可能小于状态数的。
posted @ 2022-01-24 21:44  BILL666  阅读(201)  评论(2编辑  收藏  举报