思路错点与 tricks 的一个总结

感觉自己变弱了,想卷,但是显然是完全卷不起来的。所以考虑写博客,当作一种软颓废(不想打题,而是写博客寻找自信)。

动态规划

暑假写的。StaroForgin 老师讲得很好啊,非常有启发意义。我感觉之前做的都不算动态规划。但是现在做的还不多,于是没有办法写具体的题解。

  • 费用提前计算。我们只要改变定义,并说明其结果的等价性就可以说明其正确性。e.g.P5785

  • 对于求最优方案的动态规划,我们不一定要满足每一步的转移都是完全符合数量关系的。我们只需要保证最优解一定能通过某种方式计算出来且不符合数量关系的转移不会使得答案比最优解更优。(抽象的,没有关系,我认为这个做一些题就可以领悟)e.g.P3959

  • 如何阐述一类删去无用状态的做法的正确性?说明一定有另一个有用状态不劣于这个状态。e.g.P5504

  • 数轴上的移动,一般具有贪心的性质,可以转化为区间动态规划的模型。e.g.ABC291H

  • 树上动态规划的一个通用方法,将当前枚举到的根和子树看作一个整体,与一棵新的子树进行合并。e.g.ARC142D

  • 对于一类双向覆盖的动态规划,不妨定义两个动态规划数组互相转移。e.g.P6246

  • 对于一类求最小字典序合法解的问题,可以考虑求一组状态的最小字典序的排名来转移。

  • 直接利用决策单调性得出决策上下界枚举的 2D1D 动态规划真的是 \(O(nk)\) 的吗?错了,全名是 \(O(n^2+nk)\)

  • 对于操作顺序混乱的题目,可以贪心地将其转化为操作有序的题目,进行动态规划。e.g.CF1854B

  • 对于无根树的计数,不妨选定一个根,转化为有根树计数,最后除以点数。这样方便转移。

  • 对于一类合并若干状态的计数动态规划,直接挨个合并可能会算重,这时需要强制钦定合并顺序。

  • 对于计数 \(n\) 个数的数组的动态规划,不一定要按一个一个数的加,还可以考虑先把 \(n\) 个数摆出来,然后某进制下一位一位填。e.g.P2575

  • 思考与二进制相关的偏序问题的时候,可以按 01 的值将区间划分成两端,来做区间动态规划。e.g.P5985

  • 将最大流转化为最小割做动态规划要方便得多。

  • 矩阵优化动态规划的时候,若有多组询问,可以先把 \(T^{2^i}\) 存下来,然后查询的时候就可以单次 \(O(k^2\log n)\) 了,因为是向量乘矩阵。

数据结构

  • 超级钢琴 trick。用于求贡献前 \(k\) 大的区间。

  • 树上能不能超级钢琴?可以。用点分序列,在 \(O(n\log n)\) 个点上超级钢琴。

  • 线段树的标记永久化。一种做法是标记后不再访问其字子树,以保证复杂度。

  • 标记永久化,好用。要满足交换律,这种基本的运算律。(而如果是直接下传标记,则只需要满足结合律)

  • 处理一段区间前(后)缀最大值数量或者维护与其相关的信息,可以用单调栈先算出一段后缀的答案。查询时,直接找出区间最值点,然后对于最值点右边(左边)的比较好算,左边(右边)的直接使用后缀答案相减(即 \(f_l-f_{mid}\)),因为有区间最值点这一断点,所以减出来的答案是对的。好厉害的 trick。 e.g.P3246

  • 对每个元素维护一个集合,若可以区间插入,区间删除,单点查询且保证这个元素集合大小为 \(1\),不妨直接加减或者说异或编号。e.g.AGC014E

  • 树上求连通块问题也可以尝试点分治。

数学

  • 一个可以求奇怪模数组合数的 trick:\(\dfrac{a}{b}\equiv \dfrac{a\bmod {(p\times b)}}{b}\pmod{p}\)。注意这里的除法可以是整除。e.g.P6078

  • 对于求期望的题,大概率直接大力拆贡献。

  • 考虑 \(f_i\) 为操作 \(i\) 次恰好合法的方案数,求操作 \(i\) 次仍不合法的方案数不妨考虑 \(f_{i+1}\)

  • 因为异或的逆运算是其本身,所以异或子集和的结果再做一遍子集和是原序列。超集和也是如此。

  • 让我看看是谁不知道 \(\left\lfloor \dfrac{\left\lfloor \dfrac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor \dfrac{n}{ab}\right\rfloor\) 呵!

  • \([1,r]\) 中唯一分解后质因数的指数之和最大的一定是 \(2^k\) 或者 \(2^k\times3\)。e.g.CF1174E

  • 如果我们数论中求和时 \(\gcd\) 是一个系数,或者求积时它是一个指数,那么我们可以直接无脑利用 \(\varphi\ *\ 1=\text{id}\) 来拆。

  • \(\left(\begin{matrix}n+m\\k\end{matrix}\right)=\sum\limits_{i=0}^k\left(\begin{matrix}n\\i\end{matrix}\right)\left(\begin{matrix}m\\k-i\end{matrix}\right)\) 可以在 \(k\) 较小,并且另外两维之一参与复杂运算,而另一维则只出现在二项式系数中时拆开计算。

  • \(\text{mex}\) 操作中与极大值进行操作就相当于忽略本次操作。

图论

  • 多个源点,求某一点到源点最短路的最小值,仍然可以直接使用一遍最短路求解。

  • 对于矩阵行列和的限制,不妨将其看成点,思考度数限制。

  • 有后效性的动态规划(最后动态规划数组满足某种偏序关系)可以直接 spfa。

  • 遇到删点,然后将与该点相连的点互相连边,这个可以考虑建虚点,使其保持连通性不变,且形态为一棵树。其实类似删点的操作都可以往这方面想。

  • 对于一条欧拉路径,每次操作可以反转某个环,操作若干次,一定可以得到该无向图对应的所有欧拉路。这个可以用来建模更厉害的题。

贪心

贪心确实非常重要啊,什么东西都能穿插一个贪心,脑子不够或者说脑抽就非常容易寄。

  • 一种贪心策略的证明方式是先算出下界,然后再说明这种策略跟下界是一样的。

  • 环的问题枚举分割点的时候可以考虑缩小枚举的范围,有可能可以把复杂度将 \(O(n^2)\) 降为 \(O(n)\)。(比如考虑枚举一个小区间,并说明这个区间一定存在一个割点)

posted @ 2023-09-11 21:40  TulipeNoire  阅读(19)  评论(0编辑  收藏  举报