信友队省选基础 · 壹
09/08
分治。但真的是分治吗,我怎么觉得讲的全是线段树和可持久化可撤销数据结构呢/yiw
分治问题容易用一些数据结构维护。
上午
操作序列分治
CDQ 分治与线段树分治。
问题形式:有一串修改询问,修改对于询问的影响可以叠加。
CDQ 分治
把操作序列分成两段,左边修改跟右边有关,右边修改和左边无关,于是先修改再查询。
线段树分治
我们把一个对象影响的区间放到线段树上,就实现了删除。
例题 - 函数
三种操作:
-
增加一个一次函数
-
删掉一个一次函数
-
\(x_0\) 处所有函数最大值
\(n \le 10^6\)
删除是很难维护的,但是在右半段 时光倒流 就是插入了。这样可以 \(O(n \log ^2 n)\)。
还可以线段树,把函数影响的区间搞出来放线段树上,线段树上一个节点维护一个凸包。现在是 \(O(n \log^2 n)\)。(线段树分治)
还可以优化!反正我们已经离线了,就可以按照斜率大小加入线段,插入变成 \(O(1) \times O(\log n)\)!
那么查询就这样,我们可以把询问按照 \(x\) 坐标排序,这样询问也是有序的,我们就可以在每个节点上记录现在应该看那根直线,如果询问的 \(x\) 比较大,就把这个直线变成后面的(可以认为由于询问递增,最前面的直线废掉了)。这个过程有点像斜率优化的凸包。
于是就优化到了 \(O(n \log n)\)。
CTSC2016 时空旅行
一棵树,每个点上一堆 \((x, c)\),每个点的 \((x, c)\) 们是这样来的:从 father 继承,再插入或删掉一个。
询问:对于点 \(u\) 和 \(x_0\),问 \(u\) 的 \((x, c)\) 们中的 \(\max ((x - x_0) ^ 2 + c)\)
看下形式化题面,我们看的是同一道题???
读完题再稍微变型一下式子好像就是上一题了。
不过要 dfs 序。
模板线段树分治
线段树建出来 dfs 一遍,套个可撤销的种类并查集(不可以路径压缩)。
这时另一种线段树分治的思想,只维护 一个 什么数据结构,然后 dfs 时统计。
P4585 火星商店问题
先把商店放到线段树上,每个节点放可持久化 01-Trie。
整体二分
同时进行多个询问的二分。
ZJOI2013 区间 K 大数
完全听不懂。不用整体二分的树(权值线段树)套树(动态开点普通线段树)反而正常。
POI2011 Meteors
终于懂了!这题好像比上一题简单!
我们先整体二分,定义函数 solve(optl, optr, ansl, ansr)
。我们进行这样的流程。
-
如果 \(ansl = ansr\),那直接把答案赋值了。
-
\(mid = (ansl + ansr) / 2\)。
-
把 \([l, mid]\) 的操作加进去。
-
对于 \([optl, optr]\) 的国家,计算它们现在有多少东西。
-
按照是否够,分为两半。为了便于赋值,我们可以把它们分别放到 \([optl, optr]\) 的前后缀。
-
分治。
09/15
竟然还要讲上次的题?只能说不如教我们如何写代码。D 的 \(ax+by=a(x+y \times b / a)\) 变成斜率优化形式是有点厉害。但要用到实数,不咋滴。
基础图论的高级应用。
上午
连通性问题
好像就是在讲 Block Forest。
P4320
圆方树板子题啊。
P10517
如何动态维护 lca?就是 dfs 序最小和最大的点的 lca。
考虑哪些点不能删,就是关键点构成的最小连通块中的点。
这时是个结论:\(ans = \sum d(u_i, lca) - \sum d(lca(u_i, u_i + 1), lca)\)
有了上面的 2 个 trick,这个就好维护了。
还是挺 educational 的。
最短路相关问题
P2505 HAOI2012 道路
最短路子图(最短路 DAG)。
先枚举源点,然后做一遍。
P4610
与最短路的区别在于可以公用点。
讲了啥啊,完全没听懂过。
特殊构图
P1250
额。
P2371
这不是同余最短路吗。不知道为啥是紫题。
P6965
二选一而且有要求,2-SAT。
然后好像用 01-Trie 优化建图。就是我们把一个串的两个版本都插一次,如果发现是前缀了那就是一个 2-SAT 上的关系。
但是又不懂了,看题解也晕,菜死了。
P9697
首先显然先处理 \((1, 1)\) 再 \((1, 2)\) 再 \((2, 2)\)。
然后我们注意到 \((1, 2)\) 的的操作就是 2 的点到 1 的点连边。于是我们缩点,然后没出度的点肯定这时不能变成 2 了。需要特殊考虑的是环。环上就挑一个有 \((2, 2)\) 操作到的点作为终点即可。
下午
上午的题就不写了。
唉,脑子不行,全要看题解。
P7624
差分约束显然,假设周长不难。然后???
观察样例,我们猜测:可行的答案一定是连续区间!
然而这不用猜 每个环都是一个一次不等式的限制,所以最后当然是连续区间。
那么我们要搞个分界点出来,怎么二分? 这就不会了
看了题解明白:只要有负环就不行,而且题目保证必然有解。于是我们每次随便挑一个负环出来,看看它怎么样。因为一个负环的要求是所有环的要求的一部分,一个一个来!
然后就比较正常了。
不过这个二分写法是太诡异了,似乎是根据二分答案的变化来定的。
10875
太菜了!看到图论里「按顺序加边,第一次满足 XXX 要求」竟然没想到先建最小生成树!这个 trick 是并查集例题里讲过的!
建完最小生成树这题也差不多了。剩下部分就是一个 USACO 里的树上链合并,并查集随便做!查询的话,就把合并的过程用树记下来,链上最大值查询即可!
P6965
这回明白了,按照 Wei 老师的题解写的。
但题解的代码很有误导性,\(N\) 应该开到 \(4 \times 10^6\),不知道为什么他的题解里的 \(N = 3 \times 10^6\) 过了。
没及时批判思维,于是浪费了很多时间/kk……
09/22
树链剖分,长链剖分,实链剖分。
上午
重链剖分
P2486 SDOI2011 染色
树剖,线段树维护颜色段数、左右颜色。
P3976 TJOI2015 旅游
为什么我的同学都 A 了这几题/fn/fn/fn
P4338 ZJOI2018 历史
问题转化为一个点被宣战几次。这个 trick 有点常用。
记 \(S_u = \sum subtree_u, T_u = \max subtree_u\),分讨:
-
\(S \ge 2T\),\(u\) 受到的贡献是 \(S\);
-
\(S < 2T\),\(u\) 受到的贡献是 \(2(S-T)+1\)。
单点修改怎么做?
单点修改只会影响点到根的一条链。注意到,上面那个分讨的形式有点像重链剖分。借鉴下来,我们称 2 的情况为重边,情况 1 是轻边。重链切换次数是 \(O(\log n)\) 的。
现在很近了,如何维护轻边?那我们再搞个真的树链剖分,维护链上的轻边即可。
太妙了啊!
Link-Cut Tree
wtf 10 级算法!!1
听懂了人话,Link-Cut Tree 的确很酷,但好像仍然不会写 qwq。
还是要学的。
P2387 NOI2014 魔法森林
枚举 \(a\),然后动态加边。如果成环就把环上最大边删了。
这种 LCT 维护生成树的边的方法是把边当成点加进去。然后就正常做了。
感觉 LCT 还挺正常的呢!
P9931 NFLSPC #6 挑战停机问题
听不懂/kel
长链剖分
经常用于优化树形 DP。
CF1009F
最简单的 DP 方程很好写
这个过程很像合并儿子,于是我们有类似启发式合并的方法,但这次是按照最深节点深度来。
这样就是 \(O(n)\) 的。考虑一个长链被合并后就没用了。于是每个长链被暴力合并一次,复杂度 \(O(n)\)。
BZOJ3252
长链不会重复,按照权值选就行了!
P7581
好像大概听懂了是个啥,但好像也没听懂。
10/13
Hash. 上次讲哈希还学到了集合哈希树哈希这类的技巧,这次又会有什么呢?
hehezhou?
半节课的随机玄学。
上午
字符串哈希
CF514C
这题太简单了。
二分哈希是常用技巧。
P3763 TJOI2017 DNA
二分哈希以下就完了。
集合哈希
CSP-S 2022 星战
边赋值为起点的随机权值,看看和一不一样。
有这样的想法后随便搞搞就做完了。
CF1746F
随机权值,区间和 \(\bmod k\) 判断是不是 \(0\),正确率不低于 \(1/2\)。
具体来几组呢?通常是这样的:\(\frac{1}{2^{x}} < \frac{1}{1000q}\)
最后树状数组维护一下,复杂度 \(O(n \log^2 n)\)。
树哈希
没有例题。
线性空间玄学哈希
高维向量直接变成随机数,什么玄学直觉注意力东西。
P10778
大概听懂了,好神秘。
综合应用
P2757
就是把之前的加进去,桶不是以当前数位中心回文的就行。
P5537
走法是固定的。初始节点很麻烦,先接上一段前缀。
然后我们就可以查询,用数据结构维护一下。好像是线段树二分。
10/20
本来是线性代数与 FFT,结果讲组合数学与生成函数。
特殊的数
组合数
广义组合数
组合数是分成俩集合,广义组合数就是分成一堆集合:
卡特兰数
圆排列
\((a_1, a_2, \dots, a_n)\) 构成不同环的数量。
若 \(\forall 1 \le i < j \le n, a_i \neq a_j\),圆排列数量是
计数方法
大概可以分为两种:加法和乘法配合的是直接计数法,另外的是间接计数法,或称容斥。(容斥不只是子集容斥(子集容斥就是容斥原理),正难则反也是容斥)
加法原理与乘法原理
加法原理:分类;乘法原理:分步。
容斥原理
第一个式子和 OI-Wiki 的式子是等价的
二项式反演
有时容斥有一些特殊情况,即 \(U\) 种所有元素等价,\(f_{S} = f_{|S|}\),这样就成了枚举集合大小。这样我们有二项式反演:
例题 1
我们如果求的是交集大小 \(\ge k\),就比较简单。若钦定交集是特定集合的超集 \(|S|\),那选的集合也是 \(S\) 的超集。于是就有 \(2^{2^{n - |S|}} - 1\) 种方案。
这样,不就是二项式反演了吗!用第二个式子。
P5505 JSOI2011
如果没有不分到物品太好算了,乘法原理配上隔板(暂时允许有 \(0\))。
问题是有人会 \(0\) 个,于是我们就可以钦定几个人 \(0\) 个,由于我们用可以有 \(0\) 的隔板法,那么每次算出来的都是超集,二项式反演!
\(\min - \max\) 容斥
什么鬼啊,先截图记了。
哦哦哦想了一下懂了,对的。
有什么用呢?
* 期望的线性性:\(E(A + B) = E(A) + E(B)\)。
P3175 HAOI2015
哦懂了,太厉害了!
P4707
好难。大概听懂了一点。
变成第 \(k\) 大非常妙。\(n\) 太大,枚举子集 gg,于是就运用 \(m\) 很小 dp 来搞。
生成函数基础
组合数学非常重要的工具。
基本定义
数列
index-0,无限长。
多项式
没错,多项式是可以无限项的。
多项式的系数
对于 \(f = \sum_{k \ge 0} a_k x^k\),那 \(a_n = [x^n]f\)。
有限次多项式
注意,\(n\) 次多项式指对于 \(m \ge n\),\([x^m]f = 0\)。
多项式化为有限次多项式
多项式加法与多项式减法
就是正常做。
多项式乘法
又称卷积。
多项式的逆
多项式的单位元就是 \(1\)。
\(0\) 次项非 \(0\) 才又逆。
一个相当著名的逆多项式:
所以
实际上,这是一个生成函数的收敛形式。
多项式复合
写作 \(f(g(x)), f(g), f \circ g\)。
正常算起来复杂度太高了,通常作为一个概念或搞些简单的式子。
导数
然而并没有讲完……
11/03
生成函数基础
接上周。
基本定义
导数
\(k\) 次求导:\(f^{(k)}\)
积分
导数的逆运算。但对于多项式,不完全是。因为常数项不同的多项式,倒数可以相同。不过多项式积分是钦定常数项位 \(0\)。这样积分是唯一的了。
泰勒级数
可以用有限次多项式逼近任意函数。
如果无限进行,那绝大部分函数就会和 \(f_{\infty}(x)\) 相等。
这个 \(f_{\infty}(x)\) 就是 \(f(x)\) 的泰勒级数。
指数函数
就是 \(e^x\)。
在 \(x = 0\) 时的泰勒计数就是 \(\sum_{k \ge 0} x^k / k!\)。
因此,可以认为
而多项式 \(\mathrm{exp}\) 就是
无限项求和,那 \([x^n]exp(f)\) 不太好定义。
因此通常是 \([x^0]f = 0\),这样有 \(f^k\) 的前 \(k\) 项都是 \(0\)。于是可以推出
同时,多项式 \(\mathrm{exp}\) 有指数函数相似的性质。
具体计算的话,见下图:
和求逆有点像。
对数函数
即 \(\ln x\),对 \(x = 1\) 泰勒展开是:
但这个“多项式”幂的底数不是 \(x\),于是我们也可以用 \(\ln(1 + x)\):
而 \(\ln f\) 只对常数项为 \(1\) 的计算。这样最后的 \(f - 1\) 的常数项刚好是 \(0\)。
\(g'\) 再积分回去,就是 \(g\) 了。
互逆定理
幂函数
即 \(f^k\)。\([x^0]f = 1\)。
带入互逆定理:
这样最快可以 \(O(n \log n)\)。
OGF
定义
数列的每一项附上 \(x^k\) 的权值。
简单的例子
上衣裤子鞋子,都有价格,选出总价 \(n\) 元的一套。
总价 \(n\) 元的权值记为 \(x^n\),这样答案就是 \([x^n]f\)。
这样三件东西都是个多项式,乘起来完事。
简单的例子 2
变成人民币。
多项式快速求逆即可求前 \(n\) 项。
常见数列的生成函数
斐波那契:\(\frac{x}{1 - x - x^2}\)。
卡特兰数:\(\frac{1 - \sqrt{1 - 4x}}{2x}\)
EGF
引入的例子
有标号一堆点分成两棵树,不连通,方案数?
一棵树是 \(n^{n - 2}\),我不会矩阵树定理。
最后答案是
前 \(n\) 项要 \(O(n^2)\),但变形一下
只要 \(O(n \log n)\) 就行了。
定义
好处是可以把 OGF 的二项卷积变成卷积。
带标号森林计数
先枚举树有几棵。参考上面的可以得到:
由于树实际是无序的,被我们当有序了,所以要除以 \(k!\)。
然后变形:
旁边的就是卷积,化掉:
左边那个就是 \(e^F\):
如何具体使用哪种 GF?
插接(有组合数一类),即分成一堆步骤但可以重分配:EGF。
两段直接拼接:OGF。
多项式快速算法
正片启动!
多项式乘法
学过了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探