结论&总结&tricks

图论

连通性

  • 缩点 dp 时,由于 Tarjan 算法求出的 scc 是按照拓扑逆序求出的,所以我们可以在新找到一个 scc 进行 dp 时直接枚举该 scc 每个节点的出边来更新当前 scc 的 dp 值,不必再建一个图。但使用的时候要注意,由于内部边的存在,不能用 bel 值不存在的点来更新。Code

平面图

  • 一张平面图放在一个矩形框当中,称在右边框上的点为 \(A\) 类并重新由上到下标号,则每个点所能到达的 \(A\) 类点编号连续。P4700 [CEOI2011]Traffic.

杂项

  • 一张图只要它的所有连通块都满足内部边数 \(\leq\) 点数,那么这张图存在一种方案使得每条边都被分给一个不重复的点。(想象一下基环树和树)

树论

  • 任取一节点,离该节点最远的点一定是直径的某一端点。
  • 以重心为根时,各子树大小不超过全树大小一半。
  • 树中所有点到某个点的距离和当中,到重心最小;如果两个重心,则距离和一样。
  • 两树用一条边连成一棵新树,重心在原来两树重心路径上。
  • 树上增减任一叶子,重心最多移动一边。
  • 树上差分有两种方式,一种是最后查询时求子树和,另一种是求该点到根节点的链和。有神奇的应用(P1600 [NOIP2016 提高组] 天天爱跑步)(关于树上求 K-son 和 K-father 的各种方法)。

点分治

  • 本质上来讲是在每个重心节点将一堆路径扔到一个数据结构当中快速查询统计以优化复杂度。
  • 对遍历子树的顺序并无要求(其实对遍历路径的顺序也无要求,但因为要求两条路径不在同一子树内,如果没办法容斥的话一般还是遍历一个子树时就把该子树都遍历完),因此可以各种排序。
  • 对于一类对点分治数据结构要求求路径长度在 \([L,R]\),某值取最大值的问题,可以采用叫做单调队列按秩合并的技巧。计算某一子树答案时按照子树内路径长度从小到大计算(可以排序也可以 bfs),发现 \([L - len,R - len]\) 是单调向左移动的,可以使用单调队列的技巧。但发现单调队列初始化复杂度稍加优化也只能做到 \(O(maxdep)\),其中 \(maxdep\) 是已计算的子树节点深度最大值(具体来说,我们开一个桶,把各长度的最大值丢进去,每次不初始化到 \(R\),而是初始化到 \(\min(R,maxdep)\) 即可),如果第一次访问的子树即为最深子树会被卡到 \(O(n^2)\)。所以考虑对所有子树按照 \(maxdep\) 或者 \(size\) 排序,复杂度 \(O(\sum_{i=1}^{size_{now}} maxdep_i)=O(\sum_{i=1}^{size_{now}}size_i)=O(size_{now})\),点分治总复杂度仍为 \(O(n \log n)\)

DP

  • 一般而言,对于一类让你把若干个数排成序列最大化某个值的题,本质上是状态压缩,压缩哪些数已经被选了,然后枚举接着选哪一个。

树形DP

  • 关于长链剖分:为什么CF1009F Dominant Indices不能用重链剖分替代长链剖分呢?原因是时间复杂度太高。因为重链剖分每条重链不一定延伸到最底层叶子节点,也就是说它把轻儿子所在重链合并上来的时候那条链上存的信息个数有可能大于那条链的长度(最大是那棵子树的大小),复杂度会炸成 dsu on tree?虽然这个时候继承重链信息的时候重链存的信息个数也可能大于链长从而不能像 Code 里一样的方式继承,但我们可以用 vector 往前插入数(其实把 vector 倒过来就行了)的方式来解决,这并不是关键问题。

杂项

  • 两个人从左下只能往上往右走,走到右上,路径不可相交,可以看成相交也无所谓,只要交换两个人相交后的路径即可。 P4066 [SHOI2003]吃豆豆(参看题解吧)
  • 如果设出来的状态最后存的结果是 \(0/1\),那么这时可以把状态里的一维转移到存的内容当中,变成一个最优化问题。同样的,一个最优化问题也可以把最优化的变量当成一维之后变成 \(0/1\),这时变成了对一个 \(01\) 串操作,有时能用 \(\text{bitset}\) 等优化。

数据结构

  • 本质上是将数据划分为若干堆,整体考虑以降低复杂度。复杂度可以均摊,可以考虑重构操作。

离散化

  • 对于一类离散化之后覆盖的问题要注意,如果只离散化线段端点的话,有可能存在某条线段两端点被重新覆盖但中间没被覆盖,这时会错判为它已被覆盖。解决方案是离散化排序去重后在每个数后面加上一个大 1 的数,然后再次排序去重离散化。P3740 [HAOI2014]贴海报(参看教训.md

数学

组合数学

  • 本质上是把难以计数的东西通过容斥映射等方式变成已知可计数对象的操作。
  • 有的时候一个集合很难计数,它的补集也难计数,不妨考虑二者之间能否建立起映射关系。

杂项

  • 中位数/平均数可以套路地考虑二分答案的算法。
  • 括号序列/中位数二分答案后可以转化成 -1/1 序列来考虑。
posted @ 2024-01-24 17:08  PYD1  阅读(10)  评论(0)    收藏  举报