学习笔记

数据结构

莫队

优秀的暴力,我觉得这个算法非常具有美感。
巧妙运用了分块的思想。
莫队主要解决区间问题,适用范围是当前的区间 \(l,r\) 的答案可以从 \(l-1,r\)\(l,r-1\) 转移而来且支持离线。
首先对原序列进行分块,接着根据当前区间左端点所属块对询问离线后排序。接着按照上述做法暴力计算每个区间。
时间复杂度 \(O(n\sqrt{n})\),证明略。
一些细节:莫队一般需要卡常,有几个常见优化如下。

  1. 奇偶排序:如果左端点相同按照左端点的奇偶性,对右端点进行排序,如果左端点为奇数,右端点递增排序;左端点为偶数,右端点递减排序。
  2. 块长:设置为 \(n/\sqrt m\) 一般较优,也可以直接分析完之后在代码中计算或手动计算一个块长。

相关题目:

P2709 小B的询问
P1903 [国家集训队] 数颜色 / 维护队列
P3709 大爷的字符串题

线段树

动态开点

普通线段树中一般节点会有很多浪费,很大一部分节点不会被用到,如果题目卡空间,需要使用动态开点
比较好理解的一个优化,大致思想就是节点被用到了再开,然后在结构体中记录节点的左右儿子。

权值线段树

这一类线段树较为特殊,一般维护的是原序列的某个权值,较为常见的是维护数的出现次数。
比如题目要求求出大小在 \(l,r\) 范围内的数有多少个,这时候就可以使用权值线段树来维护。
如果题目数据范围较大,需要使用到动态开点。

可持久化线段树

主要思想是对于每次新增的版本不新开整一个线段树,而是在原来的基础上新增被修改的点。由于每次被修改的点最多只有 \(logn\)个,因此空间复杂度从 \(n^2\) 优化到了 \(nlogn\)

相关题目:

P1383 高级打字机
P.S. 打模拟赛的时候做到了一道把字符串改成序列的的做法是一样的。后来听别人说离线的话可以用莫队做不知道真假的。我觉得应该很难打或者根本不可行。

主席树

同时利用了权值线段树和可持久化还有动态开点。
以模板题静态区间第 \(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

posted @ 2025-09-10 18:14  zhuoheng  阅读(22)  评论(0)    收藏  举报