一些 tricks
-
最小割的可行边和必须边判定
-
可行边:
-
满流。
-
在残余网络中找不到
的路径。
-
-
必须边:
-
满流
-
残余网络中源点能到入点, 出点能到汇点。
-
-
-
向量点积的几何意义和代数意义:
-
代数意义:
。 。 -
几何意义:设
夹角为 ,有 。
-
- 关于向量和矩阵乘法:向量其实可以写成矩阵的形式以便变换。例如
-
例如一个集合
的状态可以由某种划分方式中的任意子集 转移过来,可以钦定 包含 中某个点来防止算重。e.g.
个点两两有概率有边,计算 个点中任意集合 连通的概率。
- 计数题如果正着不好计数可以往所有情况 - 不合法情况的方向想
- 像组合数和斯特林数的递推方法有时可以作为很好的参考:
- 若将一个问题转化为一个模板后发现如果用模板的复杂度来算过不了,可以思考转化过来的时候产生了哪些特殊性质,从而从特殊性质下手优化。
- 用线段树(其他数据结构也可以参考)维护信息的时候可以不仅维护所求,并且维护可以左右拼接成所求的情况。
- 试图用二分斜率(变化量)求单峰函数极值之前,先想想中间是否存在平台。其他情况也是,先想想是不是严格满足单调性或可二分性。
- 那些在一条直线上往前跳的题,一般不是倍增就是建图。
- 遇到那种取一段操作序列的题,还有一些类似的关于操作序列区间啥的,想想能不能线段树分治。线段树分治有时候并不需要将所有操作放进去再处理,一个例子就是可以从前往后推进,有结果后再将一些操作放到线段树上后面的操作中,前提条件就是每个位置的结果只和前面有关。
- 卡时不仅可以用在模拟退火上,像暴搜更新答案(最优解)的时候也可以用(可能会被 subtask 卡炸,但总比 TLE 好)。
- 对一个序列
,如果其排序后位等差数列,那么公差
- 关于完全图的题不好做可以变为补图转化为独立集或二分图之类的。
- 字符串哈希为了方便可以直接用 unsigned long long 自然溢出。进制用
, 等。
- 数据范围超大的题想想数位 dp。
- 01分数规划解决最大/小化一个分式的问题,可以通过移项然后二分所求答案,计算出新的权值按照题目要求 check。
- 用删除堆解决优先队列删除的问题,重载
<
的时候一定要把不同的元素完全区分,不然删除堆的顺序由于大小关系不明确有可能和原堆有些许不同。就比如队中一个元素包含 个数 ,就算原堆的大小关系只需比较 ,重载<
时也要把 区分开以避免两数的 相同导致大小关系不明确造成再删除堆中顺序不同。
- 树形 dp 时,如果状态设为 “
的子树...” 不行,可以考虑按照 dfs 顺序 dp,状态就是 “dfs 遍历到 时当前...",然后依次让儿子继承当前 的 dp 数组,处理完再将此儿子的信息结合到 上。
- 多重循环优化:尽可能把限制更紧的循环放外面,举个例子,一个循环:
for(...){
if(...) continue;
for(...){
if(...) continue;
}
}
就将更容易 continue
掉的循环放在外面。
- GCD,LCM 和倍数因数关系如果想成与乘除法同级,那么可以类比与加减同级的 MAX,MIN 和大小关系类比起来想,一些方法也可以互相套一套。
- 矩阵乘法如果中间
比较多可以先枚举其中一个矩阵如果为 直接跳过,否则再计算答案。会优化很多。
- 拉插,记一记就行了。
-
一些组合意义(推出来的东西):
- 范德蒙德卷积:
\
可以理解为求 时枚举在 个中选 个,剩下 个在 中选。
- 范德蒙德卷积:
- 如果题意让最优化一个东西,但是给的限制很难处理,可以考虑放宽限制使其方便处理的同时保证多出来的答案一定不会成为最优解。
- 求类的数量可以从类中选出一个代表元后对代表元计数。
- 不存在不符合条件的元素的方案数等于:
- 计数
要不要容斥?(比如上一条)
- dp 数组如果想少计一维可以思考能否将这一维信息对后面的影响提前算出。
和加减组合可以考虑一些等价关系如 等。
eg. CF1322C
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通