i207M
2019-02-15 17:16:15
分治!
随机化!
1.高斯消元。
2.将每个点的dp值表示为另一个点dp值的函数。例如树形期望,表示成关于fa的dp值的函数。对于dp的下标单调递增的期望,可以将所有的f表示为
3.生成函数。
如果在GF里,要对一个常数次项多项式开根,可以手推出开根后系数的递推式。
递推式大概是:
同理,我们可以快速求出
如果题目中,某一个数的最大值比较小,可以尝试枚举这个数的值!
在思考时,对于一些贪心、Naive的思路不要轻易放弃,可能可以尝试证明一下,发现这样做就可以满足题目要求了
假如题目给你的限制条件很多,而你只会限制条件较少的情况,不妨容斥。
仔细画出图解,有助于发现题目中的隐含条件
把你要求的东西写出来,或者玩几个样例,答案可能就出来了
要想减小复杂度,对每个产生复杂度的地方(对每个log),仔细想想能不能用一些题目特点去掉。
对于排名可能会变化且贡献与元素顺序有关的题(最小方差生成树),可以考虑枚举所有元素的顺序(在一些题里只有
遇到比值的题,除了01分数规划,还有一种可能是:只选其中最优的一个
子序列由于不连续,所以性质不太好维护,我们换一种思考方式——值域
类似“...和...是否全等”的问题,我们可以Hash!
遇到求“互不相同”的数量,往往从“相同”的条件出发,能够找到更多性质。
填一个序列,除了从前往后填,还可以一种一种(从小到大)填,有时这样不容易算重!
CF936E:若题目条件:网格图,有黑白两种颜色,黑点和白点集合各自四联通——对每列(行)拆点!
见到“区间两两要么不相交,要么一个包含另一个”->建出关系树来!
树上路径->点分治
之前一直都是树形DP,在LCA处统计贡献或者维护子树内子树外的信息。我们可以直接以边为单位,表示从有向边
好方法(APIO2019T1):根号重构! 把操作每sqrt个分成一块,重构时不加入这块中被修改的边,这样每次操作就只有加边了。
用平衡树维护相对关系是一个常用的技巧。
有的DP优化方式不是那么显然的,对于这种情况,我们应该写下转移方程,为了发现一些神奇的性质,可以设
贪心构造题/位运算题:从高到低位确定
两条链
见到填最大值,不要总是想着从小往大/从前往后填。我们可以限制最大值的大小,直接枚举最大值的位置!
遇到奇怪的字符串相等问题,可以尝试交叉写下字符,找回文串。
我们需要统计形如“一个点到根的链”编号在[l,r]的点的权值和。一个简单的方法是离线在树上DFS,这样我们只有n次插入和很多查询,分块即可做到每次
若干数和为n,则本质不同的数最多有
树上选联通块,点分治,dfs序树形依赖背包的做法的核心思想是:我们合并两个DP数组很困难,但是我们可以通过更改顺序,使得操作变成了每次加入一个物品,这就比较方便了。
2-SAT
决策单调性DP、四边形不等式(遇到一些非常复杂难以使用数据结构的DP)
随机化
交换下标
矩阵乘法(动态DP!)
整除分块
二分
网络流
wqs二分
霍尔定理
遇到复杂的题:打表找规律!!!
倍增! ST表快速求可重区间询问。
区间询问:离线扫描线!
二进制分组
分块!!!