拆点
因为处理点往往很困难,且图论中大部分算法是对边进行操作,故可以将点拆成两个状态并连边,再运用算法解决问题。
常用于:网络流建立模型、布尔值相关问题
例题:
【SCOI2007】蜥蜴
树上序列
大部分树上序列(如欧拉序)都让同一子树的节点连续排列,从而使诸如线段树、莫队等的数据结构和算法可以解决树上的在线查询和修改的问题。
比如树上莫队和树链剖分,其实都用到了类似的思想,从而减小了时间复杂度,故而这是解决树问题的一个非常强大的工具。
例题:
【WC2013】糖果公园(详解)
异或的特点
数 a a a 异或上数 b b b 得到数 c c c ,则必有 c ≥ a 、 c ≥ b c ≥ a 、c ≥ b c≥a、c≥b ,这是有时解决异或题目非常有用的性质,比如博弈论中经典的 N i m Nim Nim游戏的解法证明正是基于异或的这个性质。
影响的传递
在处理数组时,有时会遇到区间处理的问题,如果这个问题无法快速合并和转移(即无法使用线段树、莫队等类似算法时),那么可以考虑数与多个数之间的影响,考虑能否进行分块并快速求出分出的每一块的贡献,进而将问题简化。
倍增法
在处理区间上的问题时,若两个相邻区间间存在比较容易的合并方法,则可以使用倍增法将时间复杂度中的一个 n n n 降为一个 $㏒2n $。
倍增法的运用非常多,如: R M Q RMQ RMQ问题中的st表、求 L C A LCA LCA中的倍增法,后缀数组 S A SA SA的快速求解……
例题:
【模板】后缀排序
贡献的传递性
有些时候贡献的传递性非常重要,它可以帮助你降低时间复杂度,比如从 O ( n ) O(n) O(n) 降到 O ( ㏒ 2 n ) O(㏒_2n) O(㏒2n) ,这一方法在 S O S D P SOS DP SOSDP 中有所使用。
答案的区间性
当一道题的暴力非常好写时,可以先从暴力算法入手,然后考虑优化,其中一个优化的方法就是考虑答案之间是否存在区间性,即一个答案它和满足某些条件的答案是否有一定的条件关系(比如 当 i > j i>j i>j时,必有 a n s [ i ] ≥ a n s [ j ] ans[i]≥ans[j] ans[i]≥ans[j] ),从而降低时间复杂度。
这一思想在莫队中有所使用,区间的转移其实就是这样的,还有求了后缀数组 S A SA SA 后求 h e i g h t height height 数组,也是运用了同样的方法。
例题:
【NOI2015】品酒大会