数据结构
莫队
优秀的暴力,我觉得这个算法非常具有美感。
巧妙运用了分块的思想。
莫队主要解决区间问题,适用范围是当前的区间 \(l,r\) 的答案可以从 \(l-1,r\) 和 \(l,r-1\) 转移而来且支持离线。
首先对原序列进行分块,接着根据当前区间左端点所属块对询问离线后排序。接着按照上述做法暴力计算每个区间。
时间复杂度 \(O(n\sqrt{n})\),证明略。
一些细节:莫队一般需要卡常,有几个常见优化如下。
- 奇偶排序:如果左端点相同按照左端点的奇偶性,对右端点进行排序,如果左端点为奇数,右端点递增排序;左端点为偶数,右端点递减排序。
- 块长:设置为 \(n/\sqrt m\) 一般较优,也可以直接分析完之后在代码中计算或手动计算一个块长。
相关题目:
P2709 小B的询问
P1903 [国家集训队] 数颜色 / 维护队列
P3709 大爷的字符串题
线段树
动态开点
普通线段树中一般节点会有很多浪费,很大一部分节点不会被用到,如果题目卡空间,需要使用动态开点。
比较好理解的一个优化,大致思想就是节点被用到了再开,然后在结构体中记录节点的左右儿子。
权值线段树
这一类线段树较为特殊,一般维护的是原序列的某个权值,较为常见的是维护数的出现次数。
比如题目要求求出大小在 \(l,r\) 范围内的数有多少个,这时候就可以使用权值线段树来维护。
如果题目数据范围较大,需要使用到动态开点。
可持久化线段树
主要思想是对于每次新增的版本不新开整一个线段树,而是在原来的基础上新增被修改的点。由于每次被修改的点最多只有 \(logn\)个,因此空间复杂度从 \(n^2\) 优化到了 \(nlogn\)。
主席树
同时利用了权值线段树和可持久化还有动态开点。
以模板题静态区间第 \(k\) 小为例子。
对于原序列的每个数建一个版本。
可以发现 \(l,r\) 区间内每个值域的 \(cnt\) 应为第 \(r\) 个版本的 \(cnt\) 减去第 \(l-1\) 个版本的 \(cnt\)。
于是双指针在主席树上同步搜索 \(l,r\) 的第 \(k\) 小。
图论
网络流
网络流的题目一般难点在于建模。但我一开始学网络流被卡在了反向边那里。
感性理解了一下,反向边主要解决的是在求一次增广路途中可能找到的不是最优的,而利用反向边可以进行一个反悔操作。
EK
用bfs不停找增广路,然后扩充最大流量,时间复杂度较劣,有时候懒得打dinic了可以用用。
dinic
先用一遍bfs给每个节点标上层次,然后再用dfs找增广路。时间复杂度较优,且实现难度不大,常用。
最小割最大流定理
最小割数=最大流
相关题目:
P2472 [SCOI2007]蜥蜴
P4001 [ICPC-Beijing 2006] 狼抓兔子
开始动笔:2025/9/7
upd:新增线段树部分的知识和部分知识点的补充 2025/9/9