1. 正难则反,不仅包括转换合法与不合法,还有 将逆等价的过程倒转(尤其是不太容易立刻看出来的)!!!
  2. 要求判定 关于各元素关联对象出现次数性质 的题目,可以用元素随机赋权哈希解决。
  3. 相同出现次数元素归一类,类型总数是 Θ(n)\Theta(\sqrt{n}) 的。
  4. 对于逐增类构造方案的计数,应优先考虑 每步递增方案是否导致相同的本质
  5. 即使 f(x)f(x) 全为整数,计算 f(x)af(x)\geq a 的范围时不应转化为 f(x)>a1f(x)>a-1,因为除法的向下取整机制。
  6. 对于逐步逼近或答案与理论限接近的单调界限问题,应该用 步长逐增的倍增 而非二分解决。
  7. 求解 xandaix\operatorname{and}a_ixoraix\operatorname{or}a_i 最值时,将 aia_i 子集全部标记后即可贪心。
  8. Dijkstra 的 zkw 线段树上传退出条件不是节点值无变化,而是 节点值不等于更新值
  9. 线性 STL 容器的内存最多会比静态数组多一倍。
  10. lower_bound 找的是 大于等于特定值的最小位置upper_bound 则是 大于
  11. 避免用 bitset 的无赋值运算符,会带来额外时空消耗。
  12. 真正涉及到的状态数可能远小于预期,但要注意构造数据情况。
  13. 根据端点信息和贪心策略可简化 DP 状态数。同时可以通过打表最优转移来源找规律。
  14. 有些题目中可 对小规模子问题和大规模子问题分别取更合适的做法,如根号分治。
  15. 某些 总体期望值 可以拆成 各个小部分期望 的和。
  16. 遍历树形结构过程中遇到需随当前点更新值的情况,如果无法撤回,需要分层存当前层被修改位置修改前的内容。
  17. 维护须增删元素集合的乘法积时,需要记录其中 零的个数
  18. 某些多维限制(如元素双向奔赴)问题可以用 扫描线优化掉第一维
  19. 对于计数问题,考虑 一些有序元素是否完全平等,可以简化问题。
  20. 对于字符串算法的填充字符,如果字符集不确定,可以哟 113131 的控制符填充,但不要把它们输出。
  21. 区间取最值操作线段树只用记录到区间的 次最值
  22. 二分图不重状态公平游走博弈中先手必胜当且仅当 所有最大匹配包括起始点。
  23. 前几个自然数 kk 次方(包括逆元)可以用 线性筛 Θ(n)\Theta(n) 求解。
  24. 静态数组传进函数,函数外的值也会被函数改变。用 STL 容器可避免问题。
  25. 多组数据 / 多次判定 只清空上组数据涉及到的内容。如果涉及内容离散分布在整个数组中,可以记录 上次用到特定下标的数据编号
  26. 动态有根树中若保持 fu<uf_u<u,优先用 欧拉序列 而不是 LCT。
  27. 最多同色段路径问题中每条边可以压成 最多三种颜色
  28. DAG 计数问题考虑枚举 无出度点 剥离,然后容斥。
  29. 最值状压中牢记 min-max 容斥,亦可应用于期望。
  30. 对于特定类元素 / 操作数量有限制的最优方案求解,可以 对限定操作一个惩罚值加入总代价,然后二分。
  31. 增减两侧都非严格 的单峰函数不能用三分或倍增斜率求解。但证明斜率非严格单调的函数可以。
  32. 一维或区间为状态的 DP 优先考虑决策单调性和四边形不等式。
  33. 一些操作路径中特定值的 凹陷部分可以被翻成凸起,最后变成单峰简化问题。
  34. 无左右区分的括号匹配中栈高的一段凹陷可以被翻转过来,当且仅当 两侧栈内容相同
  35. 在一般数据结构题的数据范围中,Θ(nlog2n)\Theta(nlog^2n)Θ(nn)\Theta(n\sqrt{n}) 的时间开销差不了多少。
  36. 基于 fread 的快读在某些环境中需要特判避免遇到 EOF 后还会不断读进最后几个字符。
  37. 序列的某些关系位置可能只产生 极少的等差数列,可以利用该性质加速求解。典型例子是字符串的 border
  38. 底数对 pp 取模,则指数对 φ(p)φ(p) 取模。pp 不是质数时还要判断指数是否超过了 φ(p)φ(p)
  39. 长链剖分中内容从后往前存,一定要注意数组越界的问题,包括前后。
  40. 如果为了调试中间变量注释掉某些原本代码中的语句或缩小了某些枚举的范围,在前面打个 #pragma warning 防止调试后被忽略
  41. 线段树有多种标记时,一定要注意 各种标记的优先级以及一种标记对其它标记的影响。只保持每个节点只有一种标记会导致 TLE。
  42. 值为 00 的时候需要避免与未初始化的默认值混淆。
  43. 强制转换用 C++ 的构造函数风格 而不是 C 风格,同时 每处转换都要加(避免无 long long 变量运算的问题,尤其是移位符号),防止语法判定不符合预期。
  44. 无标号类自然溢出不视作未定义行为。如果不是为了自然溢出,其风险可能不会被编译选项查到。
  45. 需要用到较多高精度数或多项式时,用 STL 封装。
  46. 调试 最优先查越界。有些数组开小了看不出来,可以先把 MAXN 开十倍。
  47. 在编写过程中需要增加某些变量时,不要把它随意加到 charbool 类型后面,数据小了查不出来。
  48. 冒险修改代码时先拷一份备份,免得麻烦的撤回,而且 Dev-C++ 的撤销会把自动补全的括号弄没。
  49. 构造题可以合理严格化其性质使其更容易判定,有时这不会影响答案存在性。最值类构造可以增量法。
  50. 先右后下的行走时间问题(红绿灯模型)预处理 每个障碍在当前回合失效 后还要多少路程。
  51. DP 套 DP 中不要将内外两层混淆,尤其是可行性和计数之间。
  52. 树直径问题考虑枚举 直径的中点或中边
  53. xk=i=0nCxiSkii!x^k=\sum_{i=0}^nC_x^iS_k^ii! 斯特林分解别忘了
  54. 组合数的维护定式 Cnx+Cn1x=Cnx+1C_n^x+C_{n-1}^x=C_n^{x+1},还可以用于 组合数定列前缀和
  55. 对于 DP,打表找(决策点)单调性、凸性,以及状压包含状态的关系。
  56. 总体要求选 min/max 方案,小部分同样是在某些不相干的值中求 min/max,那么小部分可以看作在这些值中做出一个选择。
  57. 树上分块 按需选方案(实在不行随机撒点摆烂,个数可以多一点)。比如路径问题一般只要求深度。
  58. 二维数组的合法子矩形问题,可以用扫描线、单调数据结构、悬线、并查集之类解决。找最简单实用的。
  59. 累赘而对总代价没影响的方案部分,可以在求解时忽略,先注重关键点。
  60. 数列操作问题前缀和和差分一定都要考虑,不要否决了一个忘了另一个。
  61. 贪心拿不稳的要数据分治。