ybt学习笔记
补不完了 先发出来吧
2.1 字符串基础
略
2.2 哈希
例1:哈希用途:将一个字符串映射成一个数
例2:哈希判回文:弄一个 reverse 二分回文串的一半长度
例3:二维哈希:将一块矩阵映射成一个数 其余做法同一维
例4:映射 双指针
例5:二维哈希 暴力枚举
2.3 KMP
例1:KMP用途:线性复杂度匹配单一字符串
例2:利用 nxt 数组求循环节
例3:失配树 倍增 O(nlogn) 路径压缩 O(n)
例4:用 nxt 数组解决形如 ABA 的字符串问题
2.4 Trie树
例1:用途:从头开始存储多个小串
例2:01Trie + 贪心解决异或和最大问题
例3:xor性质:x xor 0 = x | x xor x = 0 01Trie + 贪心
例4:map + vector
2.5 AC自动机
例1:用途:多模式串匹配
例2:建树优化暴力跳fail
例3:求匹配的最长前缀长度 暴力跳
3.1 并查集
例1:板子
例2:带权并查集
例3:扩大并查集
例4:用并查集代表元素维护信息
例5:逆序并查集
3.2 最小生成树
例1:树的特点:n个点有n-1条边 各点间互相连通
例2:引入新结点
例3:优化kruskal的排序 添加新边kruskal
例4:最小生成树的边是连接两个连通块边权最小的边
3.3 最短路
例1:堆优化dijkstra:不能处理负权边
例2:spfa判负环
例3:反向建图 分层图最短路
例4:用最短路实现dp转移
3.4 强连通分量
例1:tarjan缩点 将复杂度优化到线性
例2:用tarjan处理信息传递关系
例3:缩点后的强连通分量标号即为逆拓扑序
例4:差分约束 用tarjan优化有特征的最长/短路
4.1 堆的应用
例1:贪心 堆排使用场景:需要多次排序 并且每次改变的元素不多 插入复杂度O(logn) 弹出/查询O(1)
例2:找性质 可以考虑暴力\(\rightarrow\)优化
例3:实际上知道这是手写堆链表存图的写法 然而胡了个优先队列的(
例4:贪心 考虑堆的大小可以维护某些信息
4.2 树状数组
例1:树状数组作用:单点修改区间查询(常数小于线段树 而且好写!)
例2:逆序对思想:用树状数组优化类似于 \(\sum\limits_{j=1}^n\sum\limits_{i=1}^ja_i (a_i < a_j)\) 的式子的复杂度
例3:dp + 逆序对思想优化转移式 子序列问题一般可以设状态 f[i] 表示以 i 结尾的...序列
例4:区间修改区间查询(常数小于线段树 而且好写!) 考虑差分 维护 \(d_i\) 与 $d_i * i $
例5:二维树状数组 横着加一遍 竖着加一遍 容斥
例6:矩阵区间修改区间查询 考虑差分 左上角右下角 +val 左下角右上角 -val 查询式类似二维哈希
4.3 RMQ问题
例1:RMQ作用:预处理后 O(1) 查询区间最大值最小值
例2:RMQ推广 查询重叠区间没有影响的量
例3:连续不重复区间可以考虑维护队头 队头具有单调性
例4:二维st表
4.4 线段树
例1:线段树单点修改区间求和
例2:线段树区间修改区间求和 线段树作用:O(logn) 维护区间修改查询问题
例3:线段树分治
例4:线段树加乘
例5:权值线段树 很多棵线段树
4.5 LCA
例1:用 lca 求树上距离
例2:倍增维护两点间路径上的最长线段
例3:树上前缀和
例4:kruskal + lca 的综合应用 若让指定边加入最小生成树 考虑删掉该边链接的两点路径上的最长边
4.6 倍增
例1:倍增跳具有单调性的东西
例2:若一步步跳得到的结果一定 可以考虑倍增跳
5.1 背包dp
例1:01背包 拿或不拿的装状态
例2:完全背包
例3:多重背包 二进制优化/单调队列优化
例4:凑钱类题目:从小到大考虑面值 设 vis[i] 表示 i 能否被表示出来 从小到大进行转移
5.2 区间dp
复杂度一般为 \(O(n^3)\)
例1:将一个大区间分为两个小区间枚举断点转移
例2:区间涂色问题考虑区间dp:考虑左右两端点能否刷一次解决(即颜色是否相同)
例3:区间消除问题考虑区间dp:开三维 第三维记录 r 之后与 r 颜色相同的长度 转移时可以直接消掉后半段 也可以枚举 l 到 r 之间与 r 颜色相同的断点 k 将 k + 1 到 r - 1 的部分消除 把剩余并到后面 记忆化搜索
例4:二维区间dp:分别枚举水平 竖直切割线
5.4 树形dp
例1:开第二维(0/1/2等)记录每个节点在不同情况下的状态
例2:同上
例3:YBTOJ 5.4例3 最长距离 题解
例4:P2014 选课 ( 树上背包 )
5.5 状压dp
例1:通过状压维护01状态 其实可以考虑把合法的方案对数预处理出来
例2:由于经过不重不漏 可以用状压维护状态然后转移 xor可以用于从某状态中扣掉特定一位的1
例3:三维状压
例4:涉及更多状态的状压
5.6 单调队列
例1:板子 没啥好说的
例2:对于一段不大于某长度的区间问题 可以考虑枚举右端点然后单调队列维护左端点
例3:题目条件都不是白给的 牢记比你小还比你强
例4:对于转移区间包含这个点的 需要单调队列正反扫两遍
例5:对于转移区间在这个点前面隔一段的位置的 再维护一个尾指针表示最后一个入队元素的位置
6.1 矩阵快速幂
例1:快速幂板子
例2:矩阵加速 构造转移矩阵
例3:用矩阵快速幂优化顶针式dp
例4:矩阵套矩阵 YBTOJ 6.1例4 矩阵求和 题解
例5:同顶针式dp YBTOJ 6.1例5 最短路径 题解
6.2 质数与约数
例1:线性筛板子
例2:用 \(\sqrt{n}\) 的数即可筛出 \(\left[1, n \right]\) 的所有质数
例3:因为求正整数解 考虑将式子转化为 x = 什么什么 y 的形式 进而转化为整除问题 算术基本定理求解
例4:还是算数基本定理 实测直接爆搜就行() 如果要打正解还是从算数基本定理出发 从约数个数相同的最小数角度考虑剪枝优化
例5:模运算的拆分 整除分块
6.3 同余问题
例1:同余方程
例2:算术基本定理 /x 即为 乘 x 的逆元 质数 p 的欧拉函数等于 p - 1
例3:线性求逆元
例4:CRT
6.4 组合数学
例1:经典二项式定理 记得要乘上系数对应的幂次
例2:线性求组合数
例3:数论超级全家桶
6.6 数学期望
例1:期望定义
例2:线性期望 dp
例3:DAG 上的期望 dp

浙公网安备 33010602011771号