-
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状态,可设前缀答案,也可以强制最后选定点。
-
树上只需要某些关键点或者把点分成很多类分开算的问题,考虑虚树
-
求解等概率出现的某种情况,可求解总情况乘上概率。