摘要:
掌握了斜率优化dp,就可以去切一堆紫题了 斜率优化dp原理:利用数学的斜率,通过计算查找得到最优的斜率以及常数项使得答案最优 维护最佳答案选择,我们通常都要维护一个上凸包或者一个下凸包 怎么才是一个优秀的凸包? 只需要斜率单调递增/递减即可 那么我们的这个斜率怎么求? y与x的比值,分别为常数以及带 阅读全文
posted @ 2025-11-28 10:07
huhangqi
阅读(9)
评论(0)
推荐(0)
摘要:
使用情况: 可以使用双指针,但是这道题目如果带删除并不好实现,这时可以考虑用两个栈模拟队列解决问题。 时间复杂度与普通的双指针没有区别,但是每一个值需要存储一个可能很大的状态,比如一个完整的背包,导致空间复杂度可能会比较大 具体原理就是用栈来模拟队列,加入时用一个栈,每个加入的值记录的状态都需要继承 阅读全文
posted @ 2025-11-28 10:05
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
数位dp的特点 要求统计满足一定条件的数段数量 这些条件经过转化后可以使用数位的思想去理解和判断 输入会提供数字区间来限制统计 上界非常大 数位dp原理 从最高位向着低位一步一步枚举,记录下会对于后续产生影响的条件 一般在记忆化搜索时记录下是否受范围限制,若有限制则枚举而不记忆化 通过记忆化搜索来完 阅读全文
posted @ 2025-11-28 10:03
huhangqi
阅读(2)
评论(0)
推荐(0)
摘要:
树状数组,可以用于处理前缀和,前缀积,前缀最大值等等 相比于直接处理前缀和,优势在于修改和查询都是logn的,但是功能有限 树状数组通过将每一组数分为多块,提前处理好部分的和,在求值时根据特定的路径去查询 注意由于树状数组使用lowbit,所以不能直接处理0相关的问题 区间处理 在进行区间查询时,如 阅读全文
posted @ 2025-11-28 10:02
huhangqi
阅读(1)
评论(0)
推荐(0)
摘要:
最近公共祖先(LCA) LCA的常规求法包括:倍增,Tarjan LCA的求法 倍增 预处理 : \(O(n\log n)\) 查询 : \(O(\log n)\) 在线 需要在处理时处理倍增,查询时先将两个点倍增至同一高度,然后再倍增找到最近祖先。 代码: void dfs(int p,int f 阅读全文
posted @ 2025-11-28 10:01
huhangqi
阅读(5)
评论(0)
推荐(0)
摘要:
虽然CPP给的标题是线段树,但是由于后面又加了道和线段树无关的题目,然后发现这个扫描线还在二维数点里面有使用,就一并完成了,所以姑且称为 扫描线+图论优化 Part 1 扫描线 oi-wiki如是说: 扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决 阅读全文
posted @ 2025-11-28 09:59
huhangqi
阅读(1)
评论(0)
推荐(0)
摘要:
三维偏序 第一维,通过排序直接解决 第二维,通过归并排序处理 第三维,通过数据结构解决 void CDQ(int l,int r){ if(l==r)return; int mid = l+r>>1,L=l,R=mid+1; CDQ(l,mid),CDQ(mid+1,r); for(int i=l; 阅读全文
posted @ 2025-11-28 09:57
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
回归后练的第一个专题,也是写的第一篇整理 区间 dp 首先需要区间可以合并,因此通常可以枚举拆开来的点 这里的拆我们可以分成三种 第一种是最为常规的,直接在中间枚举拆分的点即可,通常范围是 \(n\le 500\) ,如果 \(n\le50\) 可能需要再设计一维的状态 第二种则是选择拆掉最左边或者 阅读全文
posted @ 2025-11-28 09:55
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
这里主要是讲无旋Treap,比较好维护,能实现大量功能,并且可持久化。 缺点在于常数大,码量大,并且时间复杂度期望为 \(\log n\),有极低概率成为大倒霉蛋。 什么是平衡树 平衡树是一种数据结构,这种数据结构是以二叉搜索树为主体,但是可以实现插入删除等操作。 平衡树比较常见的形式有 Splay 阅读全文
posted @ 2025-11-28 09:53
huhangqi
阅读(1)
评论(0)
推荐(0)
摘要:
定义 强联通分量:在有向图中任意两个节点连通的有向图(SCC) 点双连通分量:删除任意节点仍然连通(v-DCC) 边双连通分量:删除任意边仍然连通(e-DCC) 割点:删除这个点以后图的连通性会发生改变的点 桥:删除这条边后图的连通性会发生改变的边 Tarjan Tarjan 算法可以求出上面的所有 阅读全文
posted @ 2025-11-28 09:51
huhangqi
阅读(2)
评论(0)
推荐(0)
摘要:
分成线段/直线两种 直线 自己取最值一定在一个区间里面 先比较同一段的中间值,让更优的占据这个点,之后再下传,这样每次都只下传一条直线了 查询如果单点查询,就向下然后把永久化标记都算一遍 区间查询直接找两个端点即可 合并时每条线段最多到底,时间复杂度 \(O(n\log n)\) 其余皆 \(O(\ 阅读全文
posted @ 2025-11-28 09:46
huhangqi
阅读(1)
评论(0)
推荐(0)
摘要:
决策单调性,通过决策点的单调性进行处理,从而优化 dp 的时间复杂度 对于这种题目,可以分为几个过程来完成题目: 敲暴力 观察是否有其它的优化方式 分析最优决策点位置/打表 得到如何使用决策单调性优化 石子合并 区间合并问题基本转移如下: \[ f_{l,r}=\min f_{l,k}+f_{k+1 阅读全文
posted @ 2025-11-28 09:44
huhangqi
阅读(1)
评论(0)
推荐(0)
摘要:
矩阵乘法方式,左边的行乘上右边的列,最终答案的行数与左边相等,列数与右边相等 左行右列 矩阵乘法必须在左矩阵列数与右矩阵行数相同时才可以进行 矩阵乘法满足结合律,不满足一般的交换律。 板子: struct MT{ int c[7][7],n,m; MT(){ n=m=0; memset(c,0x3f 阅读全文
posted @ 2025-11-28 09:42
huhangqi
阅读(2)
评论(0)
推荐(0)
摘要:
常规莫队 莫队用来处理一系列离线问题,可以在较短时间内移动一步区间的操作可以使用莫队来解决。 时间复杂度 传统的莫队只需要解决区间上的问题,因此只包含左端点和右端点,一般是按照 \(\sqrt n\) 的块长,以 \(l\) 所在的块为第一关键字,以 \(r\) 为第二关键字。 这样在 \(O(1) 阅读全文
posted @ 2025-11-28 09:39
huhangqi
阅读(2)
评论(0)
推荐(0)
摘要:
反正就给自己看,那么就随便写写 吐槽一下CPP为什么这么迟才教二分图 一个图是二分图,那么这个图就一定可以分成两部分,这两部分的点一定不会与自己的只一部分直接相连 二分图的判断非常水,直接黑白染色就可以了 只要没有奇环(我tm打qihuan都比打jihuan要快)就可以了 然后就会有很多的板子题了 阅读全文
posted @ 2025-11-28 09:37
huhangqi
阅读(2)
评论(0)
推荐(0)
摘要:
点分治就是在树上拿点分治 但是只能按照某个点对一个子树进行处理,所以一般处理路径问题 主要是找到重心,然后一直向下递归 找中心有个比较吊的写法,直接拿上一次这个点得到的大小作为子树大小求重心,正确性不会证明,直接用吧。 贴个代码: #include<bits/stdc++.h> using name 阅读全文
posted @ 2025-11-28 09:36
huhangqi
阅读(1)
评论(0)
推荐(0)
摘要:
定义 差分约束系统 是一种特殊的 \(n\) 元一次不等式组,它包含 \(n\) 个变量 \(x_1,x_2,...x_n\) 以及 \(m\) 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 \(x_i-x_j\le c_k\),其中 \(1\le i,j\le n,i\not=j,1 阅读全文
posted @ 2025-11-28 09:31
huhangqi
阅读(0)
评论(0)
推荐(0)
摘要:
首先讲讲 KMP 是怎么实现的。 题目: 题目: 求模式串在待匹配串中的出现次数。 明显可以直接暴力枚举,首先确定左端点,然后向右跑即可 考虑优化这一过程 我们考虑在整个字符串中匹配以某个字符为末尾的最长匹配 那么我们直接跑过去,如果完全匹配,最优情况下肯定是 \(O(n)\) 的 但是如果不是最优 阅读全文
posted @ 2025-11-28 09:25
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
CSP-S T3 竟然考AC自动机! CPP 居然没教过,太坏了 要建AC自动机,首先需要建一个 trie 树 然后核心就是在于 build,我们用 bfs 去跑 由于需要多次进行匹配,我们找到一个border最长的,显然一个的border是父亲的对应的儿子过去 反正最后挺好弄的 代码: void 阅读全文
posted @ 2025-11-28 09:23
huhangqi
阅读(1)
评论(0)
推荐(0)

浙公网安备 33010602011771号