灵神题单/自用
时间久了记不清哪些刷过,哪些未刷过。遂用复选框改造,做题后留痕。
零、常用枚举技巧
§0.1 枚举右,维护左
对于 双变量问题,例如两数之和 ai+aj=ta_i+a_j=tai+aj=t,可以枚举右边的 aja_jaj,转换成 单变量问题,也就是在 aja_jaj 左边查找是否有 ai=t−aja_i = t-a_jai=t−aj,这可以用哈希表维护。
我把这个技巧叫做 枚举右,维护左。
讲解
§0.2 枚举中间
对于三个或者四个变量的问题,枚举中间的变量往往更好算。
一、前缀和
§1.1 基础
讲解
§1.2 前缀和与哈希表
通常要用到「枚举右,维护左」的技巧。
讲解
§1.3 距离和
图解
§1.4 前缀异或和
§1.5 其他一维前缀和
§1.6 二维前缀和
【图解】一张图秒懂二维前缀和!
二维前缀最小值:
二、差分
§2.1 一维差分(扫描线)
原理讲解(推荐和【图解】从一维差分到二维差分 一起看)
§2.2 二维差分
【图解】从一维差分到二维差分
三、栈
§3.1 基础
§3.2 进阶
§3.3 邻项消除
§3.4 合法括号字符串
注:部分题目可以不用栈,而是用一个数字记录嵌套深度。
§3.5 表达式解析
§3.6 对顶栈
§3.7 单调栈
见 单调栈题单。
四、队列
队列常用在 BFS 中,见 网格图题单 和 图论题单。与此相比,栈常用在 DFS 中,但无需我们手动维护。
§4.1 基础
§4.2 设计
§4.3 双端队列
§4.4 单调队列
个人觉得叫单调双端队列更准确。
原理讲解
§4.5 单调队列优化 DP
一般用来维护一段转移来源的最值。
- 前提:区间右端点变大时,左端点也在变大(同滑动窗口)。
- 转移前,去掉队首无用数据。
- 计算转移(直接从队首转移)。
- 把数据(一般是 f[i]f[i]f[i])插入队尾前,去掉队尾无用数据。
五、堆(优先队列)
§5.1 基础
§5.2 进阶
§5.3 重排元素
§5.4 第 K 小/大
部分题目也可以用二分解决。
§5.5 反悔堆
基于堆的反悔贪心。
§5.6 懒删除堆
§5.7 对顶堆(滑动窗口第 K 小/大)
也可以用有序集合。
另见 图论题单 中的 Dijkstra 算法。
六、字典树(trie)
§6.1 基础
§6.2 进阶
§6.3 字典树优化 DP
§6.4 0-1 字典树(异或字典树)
部分题目也可以用试填法解决。
七、并查集
§7.1 基础
见 网格图题单 中的 DFS 和 图论题单 中的 DFS,其中大部分题目也可以用并查集实现。
§7.2 进阶
§7.3 公因数并查集
也叫 GCD 并查集。
§7.4 数组上的并查集
§7.5 区间并查集
§7.6 边权并查集
八、树状数组和线段树
能用树状数组解决的题目,也能用线段树解决(反过来不一定)。但树状数组实现简单,代码短。
为方便大家练习,我把适合用树状数组解决的题目分到树状数组中,其余分到线段树中。
§8.1 树状数组
讲解:带你发明树状数组!附数学证明
§8.2 逆序对
除了可以用树状数组解决,部分题目也可以在归并排序的同时计算。
§8.3 线段树(无区间更新)
§8.4 Lazy 线段树(有区间更新)
§8.5 动态开点线段树
部分题目也可以用珂朵莉树解决。
专题:离线算法
对询问排序,通过改变回答询问的顺序,使问题更容易处理。
相应的,在线算法就是按照 queries\textit{queries}queries 的顺序一个一个处理。
关联题单
分类题单
如何科学刷题?
- 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针)
- 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
- 单调栈(基础/矩形面积/贡献法/最小字典序)
- 网格图(DFS/BFS/综合应用)
- 位运算(基础/性质/拆位/试填/恒等式/思维)
- 图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)
- 动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
- 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
- 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
- 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
- 链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)
- 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)
我的题解精选(已分类)
欢迎关注 B站@灵茶山艾府
如果你发现有题目可以补充进来,欢迎评论反馈。
在线工具