• bitset优化可行性背包

  • 对称思想
    如大于某值的和小于某值的个数相同,用等于某值的来推。
    dp状态中\((i,j)\),可以换成\((j,i)\)
    正反对称:如正向得到了多少,反向就减少了多少。

  • 离散化区块
    针对一些给定上下界的计数问题。可以把区间端点离散化,然后分成约\(2n\)个块,保证每个区间由块构成。

  • 数列可重
    首先考虑一下强制把相同的值定一个大小关系(当做不同的值)处理可不可以。

  • 树的中心(直径的中点)在边上。
    每条边\((u,v)\)拆成\((u,mid)\)\((mid,v)\)。当然两点间距离翻倍。

  • 构造题

    • 有时候不需要去想可行的条件。只需要找不可行的,可行的部分直接通过构造证明。
    • 一定从边界入手,想出方案也可在边界处验证。
    • 必要性的会更好找,找到后再证明充分。
  • 求方案数时:操作方案不好求(有时候要去重),求最终形态的方案,可以考虑将最终形态进行双射成另一个模型进行统计。

  • 相对运动

  • 做题要看子任务!!以及特殊性质(如特殊数值,奇偶性)

  • 问的\(k\)次操作的答案,可以考虑能否在\(k-1\)次操作下调整。

  • 最大流=最小割

  • 三联通(图上两点间最多有三条不相交的路径)要满足删除每条边后两点都在同一边双里。

  • 组合数转组合意义(经常可以dp)

  • 位运算:与、或、异或之间可相互转换。

  • 数列操作考虑差分数组

  • 搜索注意复杂度与减枝,有时候看起来很明显的剪枝,如空集一定要考虑。(诈骗题

  • 异或和转化为求和:考虑每个值出现次数的奇偶性。

  • 从维度的角度分析问题,尤其是二维可以画函数关系图像。

  • 线段树大小扩到\(2\)的次幂,这样每一段都是\(2\)的次幂,可以利用倍增预处理的信息。

  • 【卡常】如果多次以同样顺序dfs,可以跑一遍数组存下dfs序,之后直接遍历数组会快很多。

  • 字典序最小等价于优先最大的值填入尽量靠后的位置。

  • 倍增:求第一个到某临界:转化为求最后一个不到临界的状态,二进制从高到低位贪心。

  • 每个点出发的所有最长路径都必经过同一个点。(直径的中点)

  • 时光倒流(正难则反)

  • 目的性优化(复杂度):只走能达到目的的状态

  • 任意结点\(儿子数 \ge 2\) 的树上, \(点数 \le 2*叶子数\)

  • 简化图:按某度数限制删点或缩点,如有向图将出度为 \(1\) 的点与所连点合并。

  • [反悔贪心] 多个属性,先全选某一个属性,其余的属性加上已选的反悔值,这样就少了一个属性。

  • [warning] mx赋初值有时候是-inf不是0

  • [贪心排序] 邻项交换
    目标:使得下标 \(i<j\) 的满足某不等式,该不等式符号两边分别只与 \(i,\ j\) 其一变量有关,可以等价于排序。
    运用:\(i<j\) 如果满某如上不等式,就要交换,即可用上述排序得到最优序列。(正确性:其余序列因为可以通过交换达到更大都不及最优)
    e.g. 两个属性 \(y\)\(z\),得到目标序列满足所有选 \(y\) 属性的位置都在 \(z\) 之前。
    使得 \(i<j\), 满足 \(y_i+z_j>y_j+z_i\),即按照 \(y-z\) 排序。

  • 多维偏序(大小关系):先按某一维排序

  • 枚举法!!!(老是忘记)

  • 推性质,用数学公式表示时,敢于设变量。

  • 设dp状态,可设前缀答案,也可以强制最后选定点。

  • 树上只需要某些关键点或者把点分成很多类分开算的问题,考虑虚树

  • 求解等概率出现的某种情况,可求解总情况乘上概率。