私は灰の魔女イレーナです
既然多头说记录技巧比较重要,那就写个记录吧,希望至少能提升点啥。
\(DP\),如果题目要求的是求一个问题的最优解(如:完成一个任务 XXX 的最大/最小代价),设计状态时可以考虑从繁杂出发,设一个 \(bool\) 数组,表示满足状态条件是否能够完成,然后再考虑优化。(\(eg:P2224\))
\(DP\),如果题目要求对满足要求的一种字符串计数,那常用方法是先解决满足要求的字符串判定问题,然后把要用的东西丢进 \(DP\) 数组里面,然后再进行 \(DP\)。这个东西个人认为和 \(DP\) 套 \(DP\) 差不多,可以先写一个 \(trans\) 数组,表示这个状态的下一位是哪个,再来进行转移。简单来说就是先判定再计数。(\(eg:P4590\))
\(DP\),判断一个东西是否满足四边形不等式定理有一个非常简单方法。拉出来一长一短两个区间,同时向长短两个区间后面增加一个数,如果可以判断这两个区间加了这个数之后哪个增加的代价更大(比较的是差量),那么这个东西就满足四边形不等式定理。
如果是大区间的增加量大于小区间的增加量,那么我们可以求出这个问题的最小代价。
相反的,如果是小区间的增加量大于大区间的增加量,那么我们可以求出这个问题的最大收益。
四边形不等式这个定理很强,它可以推出来决策单调性,完全单调性和凸函数。
\(2D/1D\) 的决策单调性可以用分治来优化。(\(eg:P5574\))
完全单调性可以二分队列。(\(eg:P1912\))
凸函数 \(wqs\) 二分即可。(\(eg:P4383\))
\(DP\),当在序列上做 $ \min/\max $ 计数的时候可以考虑在排序之后来解决。
\(DP\),一些 $ \min/\max $ 计数问题和绝对值计数问题可以转化为序列匹配问题。
\(DP\),序列匹配问题的计数套路是设序列前 \(i\) 个数中匹配了 \(j\) 个的 \(\cdots\) (\(eg:P8321\))
字符串,排列字符串使其字典序最小的方法是相邻调整法,即对于两串 \(a,b\),若 \(a+b<b+a\),则称 \(𝑎\) 小于 \(𝑏\)。
\(DP\),\(DP\) 的时候要考虑多种转移顺序,不一定是顺序。(\(eg:ABC225F\))
\(DS\)?反正有 \(popcount\) 操作的时候要想到值域很小。
图论,看到只经过边权 \(\le\) 或者 $ \ge $ 的边要想到 $ kruskal $ 重构树。
图论,要让两个点的 \(LCA\) 深度最小,那么就是要让两个点的 dfs 序差异最大。
DS,线段树合并不垃圾回收的空间复杂度为 $ O(n\log n) $。垃圾回收的空间复杂度为 $ O(n) $,但是也要开四倍空间!!!
杂类,摩尔投票法可以使用线段树来维护。
分块,空间开不下的时候可以滚块!!!
杂项,一切似乎不可优化的式子都要考虑单调性!!!
杂项,树上路径问题,可以考虑点分治。
杂项,对于 $ l \le i \le j \le r $ 的问题,答案为 $ \min / \max $ 的时候考虑支配对,答案为和或积的时候考虑分治。
杂项,看到一堆数的乘积的时候想到如果一项为 0,那么式子值为 0。
杂项,看到异或要想到线性基。
Math,两个组合数乘起来的时候可以想到范德蒙德卷积。