小技巧Trick-思路-个人总结
i207M
2019-02-15 17:16:15
### 难以想到的算法:
分治!
随机化!
### 遇到不会的判断条件,尝试转化它,写出来成立的充要条件,考虑优化
## 求解概率、期望的几个常用技巧
1.高斯消元。
2.将每个点的dp值表示为另一个点dp值的函数。例如树形期望,表示成关于fa的dp值的函数。对于dp的下标单调递增的期望,可以将所有的f表示为$kf_0+b$的形式。
3.生成函数。
## 生成函数
如果在GF里,要对一个常数次项多项式开根,可以手推出开根后系数的递推式。
![img](https://cdn.luogu.com.cn/upload/pic/52186.png)
递推式大概是:$(n-1)a[n-1]-6na[n]-(n+1)a[n+1]-a[n-1]=-3a[n]$
同理,我们可以快速求出$G(x)=Q(x)^P$:先求导,两边乘$Q(x)$得:
$G'(x)=PG(x)Q'(x)$
$Q(x)/(1-x)$相当于对系数求前缀和。
同理多项式除法可以手玩出递推关系。
### 见到10进制位的乘积,意识到质因数只有2357!
### 见到01状态,想到2-sat!
### 如果在讨论情况时,发现情况过多,不妨建图解决
### 枚举整数划分的好方法是DP:新加一个1,或者集体+1
环上的问题考虑断环成链(比如延长两倍接在后面、发现有一条边不会经过于是断开它)
### 直接算期望较困难时,不妨考虑每个点的贡献
### 当若干数的和为N时,不同的数最多有$2\sqrt{N}$种
转换坐标,比如用新的基底表示空间。
遇到下标取模的问题,尝试分$a[i],a[i+n]$两种情况讨论
**插眼法:枚举长度,每隔len放置一个观察点**
如果一道题思路卡住了,不妨想想暴力如何写,尝试从暴力的基础上改动。
**可持久化二分答案**
**可持久化扫描线**
推递推式时,如果发现每一项都是$i!$的倍数,不妨都$/i!$
## 循环展开8层最快
如果题目中,某一个数的最大值比较小,可以尝试枚举这个数的值!
**在思考时,对于一些贪心、Naive的思路不要轻易放弃,可能可以尝试证明一下,发现这样做就可以满足题目要求了**
假如题目给你的限制条件很多,而你只会限制条件较少的情况,不妨容斥。
**仔细画出图解,有助于发现题目中的隐含条件**
**把你要求的东西写出来,或者玩几个样例,答案可能就出来了**
要想减小复杂度,对每个产生复杂度的地方(对每个log),仔细想想能不能用一些题目特点去掉。
### 见到“最大值(或其他的值)$=x$”的概率,转化为$\le x$的概率
### 见到区间最小值,想到笛卡尔树
对于排名可能会变化且贡献与元素顺序有关的题(最小方差生成树),可以考虑枚举所有元素的顺序(在一些题里只有$O(n^2)$种);或考虑每个元素在什么时候贡献。
**遇到比值的题,除了01分数规划,还有一种可能是:只选其中最优的一个**
## 因数个数不多!!!
子序列由于不连续,所以性质不太好维护,我们换一种思考方式——**值域**
类似“...和...是否全等”的问题,我们可以**Hash**!
遇到求“互不相同”的数量,往往从“相同”的条件出发,能够找到更多性质。
# 发现式子推不动了——从组合意义的角度去考虑!!!
填一个序列,除了从前往后填,还可以一种一种(从小到大)填,有时这样不容易算重!
CF936E:若题目条件:网格图,有黑白两种颜色,黑点和白点集合各自四联通——对每列(行)拆点!
**见到“区间两两要么不相交,要么一个包含另一个”->建出关系树来!**
树上路径->点分治
## 统计树上所有路径的好方法!
之前一直都是树形DP,在LCA处统计贡献或者维护子树内子树外的信息。我们可以直接以边为单位,表示从**有向**边$(u,v)$开始的,所有路径的信息!(例题:LOJ迷失的字符串)
好方法(APIO2019T1):**根号重构!** 把操作每sqrt个分成一块,重构时不加入这块中被修改的边,这样每次操作就只有加边了。
用平衡树维护相对关系是一个常用的技巧。
### DP优化方程
有的DP优化方式不是那么显然的,对于这种情况,我们应该**写下转移方程**,为了发现一些神奇的性质,可以**设$j<k$,找出i从j转移由于从k转移的条件**
**贪心构造题/位运算题:从高到低位确定**
**两条链$(a,b),(A,B)$的链并长度的两倍等于两条链的长度+dis(a,A)+dis(b,B)**
见到填最大值,不要总是想着从小往大/从前往后填。我们可以限制最大值的大小,直接枚举最大值的位置!
遇到奇怪的字符串相等问题,可以尝试交叉写下字符,找回文串。
我们需要统计形如“一个点到根的链”编号在[l,r]的点的权值和。一个简单的方法是离线在树上DFS,这样我们只有n次插入和很多查询,分块即可做到每次$O(1)$查询。
若干数和为n,则本质不同的数最多有$\sqrt n$个
树上选联通块,点分治,dfs序树形依赖背包的做法的核心思想是:我们合并两个DP数组很困难,但是我们可以通过更改顺序,使得操作变成了每次加入一个物品,这就比较方便了。
------------
# 容易遗忘的算法
2-SAT
决策单调性DP、四边形不等式(遇到一些非常复杂难以使用数据结构的DP)
随机化
交换下标
矩阵乘法(动态DP!)
整除分块
二分
网络流
wqs二分
霍尔定理
遇到复杂的题:打表找规律!!!
**倍增!** ST表快速求可重区间询问。
区间询问:离线扫描线!
# 数据结构
二进制分组
**分块!!!**