1.考试的时候先考虑dp
和线段树
2.记得检查数组空间
3.考虑尽量卡常
4.尽量考虑退式子
5.看到关于01爆搜选择的一定要先考虑01背包,不要直接写爆搜
6.清楚要不要文件读写和子文件夹
7.树上边权转点权转移到儿子节点,但是特别注意多余信息处理(尤其是树剖的时候)
比如树剖结束的时候处理最后一条重链,最顶端节点的答案不能处理进去(因为会有多余信息(\(top_x,fa_{top_x}\)))还有一些计数题比如说统计路径上有多少个不同颜色的,注意一下根节点的多余数据处理(因为根节点是没有颜色的)。
8.看清楚是有向图还是无向图,无向图空间要开 2 倍
9.在缩点或拆点时分清旧图和新图
数据结构题不要只想 log 结构,分块它不香吗?根号分治它不香吗? 莫队它不香吗?
有些 DS 题会问你一个区间 \([l,r]\) 内需要划分成至少几个子序列以满足题意,比如这道题,这个时候有一种思路就是先双指针处理出每个点往右边能够预处理的最右点,然后倍增即可。
FHQ Treap 在处理区间信息的时候如果需要维护懒标记的时候需要注意 Merge() 函数中 x,y 都需要下传懒标记。典型例题。
无论是什么 ds 题,一定要将想法往可合并性上靠(莫队/分块:?)。
如果出现区间取模/取对数/开根号之类的玩意,可以考虑这玩意取模会砍半/取对数与开根号数字降的很快等从而可以暴力做并且复杂度正确,并且该情况下单点修改操作也允许并且复杂度也是对的。
DP:
遇到类似于 n 个东西分成两组,差最小等问题,不要总是想着一些奇奇怪怪的算法,如果就是个容量为 \(\frac{n}{2}\) 的背包问题呢? 此时的体积和价值都是这 n 个东西的属性。
遇到区间问题多想想差分,尤其是树上差分。
类根号分治思想真的是非常常见又好用的一种思想!
看到题目中有回溯操作时,除了可持久化外也可以想想建立操作树。
当你想不出题目的时候不妨考虑一下随机化乱搞比如说模拟退火或者是随机权值和 hash/xor hash。
对于一张无向图的邻接矩阵而言,如果 \(A_{i,j}\) 表示 \(i\) 与 \(j\) 之间是否有连边,那么做矩阵快速幂 \(A^k\) 之后,\(A_{i,j}\)的值表示从 i 出发走 k 步有多少方案到 j。
位运算三大处理方法:线性基(异或专属),拆位,01Trie。推式子时可能 a⊕b=a|b-a&b 会有用。
拆位处理二进制时,注意或得到 0 和与得到 1 的限制是更严的,做题先考虑这一点。
枚举 \(S\) 及其子集,\(O(3^n)\)
for(int r=s;r;r=(r-1)&s)
复杂度证明考虑枚举子集 ,然后写出式子二项式定理化简。