信友队省选基础 · 壹

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)。我们进行这样的流程。

  1. 如果 \(ansl = ansr\),那直接把答案赋值了。

  2. \(mid = (ansl + ansr) / 2\)

  3. \([l, mid]\) 的操作加进去。

  4. 对于 \([optl, optr]\) 的国家,计算它们现在有多少东西。

  5. 按照是否够,分为两半。为了便于赋值,我们可以把它们分别放到 \([optl, optr]\) 的前后缀。

  6. 分治。

AC.

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\),分讨:

  1. \(S \ge 2T\)\(u\) 受到的贡献是 \(S\)

  2. \(S < 2T\)\(u\) 受到的贡献是 \(2(S-T)+1\)

单点修改怎么做?

单点修改只会影响点到根的一条链。注意到,上面那个分讨的形式有点像重链剖分。借鉴下来,我们称 2 的情况为重边,情况 1 是轻边。重链切换次数是 \(O(\log n)\) 的。

现在很近了,如何维护轻边?那我们再搞个真的树链剖分,维护链上的轻边即可。

太妙了啊!

wtf 10 级算法!!1

听懂了人话,Link-Cut Tree 的确很酷,但好像仍然不会写 qwq。

还是要学的

P2387 NOI2014 魔法森林

枚举 \(a\),然后动态加边。如果成环就把环上最大边删了。

这种 LCT 维护生成树的边的方法是把边当成点加进去。然后就正常做了。

感觉 LCT 还挺正常的呢!

P9931 NFLSPC #6 挑战停机问题

听不懂/kel

长链剖分

经常用于优化树形 DP。

CF1009F

最简单的 DP 方程很好写

\[dp_{u, dep} = \sum_{v \in son_u} dp_{u, dep - 1} \]

这个过程很像合并儿子,于是我们有类似启发式合并的方法,但这次是按照最深节点深度来。

这样就是 \(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,结果讲组合数学与生成函数。

特殊的数

组合数

广义组合数

组合数是分成俩集合,广义组合数就是分成一堆集合:

\[\binom{n}{a_1, a_2, \dots, a_k} = \frac{n!}{\prod_{i = 1}^{k}a_i!} \]

卡特兰数

\[C_n = \binom{2n}{n} - \binom{2n}{n - 1} = \sum_{i = 0}^{n - 1} C_i C_{n - i - 1} + [n = 0] \]

圆排列

\((a_1, a_2, \dots, a_n)\) 构成不同环的数量。

\(\forall 1 \le i < j \le n, a_i \neq a_j\),圆排列数量是

\[(n - 1)! \]

计数方法

大概可以分为两种:加法和乘法配合的是直接计数法,另外的是间接计数法,或称容斥。(容斥不只是子集容斥(子集容斥就是容斥原理),正难则反也是容斥)

加法原理与乘法原理

加法原理:分类;乘法原理:分步。

容斥原理

\[f_S = \sum_{T \subseteq S} g_T \Leftrightarrow g_S = \sum_{T \subseteq S} (-1)^{|S| - |T|} f_T \]

\[f_S = \sum_{S \subseteq T \subseteq U} g_T \Leftrightarrow g_S = \sum_{S \subseteq T \subseteq U} (-1)^{|T| - |S|} f_T \]

第一个式子和 OI-Wiki 的式子是等价的

\[|U| = \sum_{S \subseteq U} (-1)^{|S| - 1} |S| \]

二项式反演

有时容斥有一些特殊情况,即 \(U\) 种所有元素等价,\(f_{S} = f_{|S|}\),这样就成了枚举集合大小。这样我们有二项式反演:

\[f_i = \sum_{j = 0}^{i} \binom{i}{j}g_j \Leftrightarrow g_i = \sum_{j = 0}^{i} (-1)^{i - j} \binom{i}{j} f_j \]

\[f_i = \sum_{j = i}^{n} \binom{n - i}{j - i}g_j \Leftrightarrow g_i = \sum_{j = i}^{n} (-1)^{j - i} \binom{n - i}{j - i} f_j \]

例题 1

image

我们如果求的是交集大小 \(\ge k\),就比较简单。若钦定交集是特定集合的超集 \(|S|\),那选的集合也是 \(S\) 的超集。于是就有 \(2^{2^{n - |S|}} - 1\) 种方案。

这样,不就是二项式反演了吗!用第二个式子。

P5505 JSOI2011

如果没有不分到物品太好算了,乘法原理配上隔板(暂时允许有 \(0\))。

问题是有人会 \(0\) 个,于是我们就可以钦定几个人 \(0\) 个,由于我们用可以有 \(0\) 的隔板法,那么每次算出来的都是超集,二项式反演!

\(\min - \max\) 容斥

什么鬼啊,先截图记了。

哦哦哦想了一下懂了,对的。

image
image

有什么用呢?

image

* 期望的线性性:\(E(A + B) = E(A) + E(B)\)

P3175 HAOI2015

哦懂了,太厉害了!

image

P4707

好难。大概听懂了一点。

变成第 \(k\) 大非常妙。\(n\) 太大,枚举子集 gg,于是就运用 \(m\) 很小 dp 来搞。

image
image

生成函数基础

组合数学非常重要的工具。

基本定义

数列

index-0,无限长。

多项式

\[\sum_{k \ge 0} a_kx^k \]

没错,多项式是可以无限项的。

多项式的系数

对于 \(f = \sum_{k \ge 0} a_k x^k\),那 \(a_n = [x^n]f\)

有限次多项式

注意,\(n\) 次多项式指对于 \(m \ge n\)\([x^m]f = 0\)

多项式化为有限次多项式

\[f \bmod x^n = \sum_{k = 0}^{n - 1} [x^k]f \cdot x^k \]

多项式加法与多项式减法

就是正常做。

多项式乘法

\[[x^n](f*g) := \sum_{k = 0}^{n} [x^k]f \cdot [x^{n - k}]g \]

又称卷积。

多项式的逆

image

多项式的单位元就是 \(1\)

\(0\) 次项非 \(0\) 才又逆。

一个相当著名的逆多项式:

\[(\sum_{k \ge 0} x^k) * (1-x) = 1 \]

所以

\[\sum_{k \ge 0} x^k = \frac{1}{1 - x} \]

实际上,这是一个生成函数的收敛形式。

多项式复合

写作 \(f(g(x)), f(g), f \circ g\)

\[f(g) = \sum_{k \ge 0} [x^k]f \cdot g^k \]

正常算起来复杂度太高了,通常作为一个概念或搞些简单的式子。

导数

\[[x^n]f' = (n + 1)[x^{n + 1}]f \]


然而并没有讲完……

11/03

生成函数基础

接上周。

基本定义

导数

\[(f*g)' = f'*g + f * g' \]

\[f(g)' = f' * g' \]

\(k\) 次求导:\(f^{(k)}\)

积分

导数的逆运算。但对于多项式,不完全是。因为常数项不同的多项式,倒数可以相同。不过多项式积分是钦定常数项位 \(0\)。这样积分是唯一的了。

\[[x^n]\int f \mathrm{d}x = \frac{1}{n} [x^{n - 1}]f \]

泰勒级数

image

可以用有限次多项式逼近任意函数。

如果无限进行,那绝大部分函数就会和 \(f_{\infty}(x)\) 相等。

这个 \(f_{\infty}(x)\) 就是 \(f(x)\) 的泰勒级数。

指数函数

就是 \(e^x\)

\(x = 0\) 时的泰勒计数就是 \(\sum_{k \ge 0} x^k / k!\)

因此,可以认为

\[\mathrm{exp}(x) = e^x = \sum_{k \ge 0} x^k / k! \]

而多项式 \(\mathrm{exp}\) 就是

\[\mathrm{exp}(f) = e^f = \sum_{k \ge 0} f^k / k! \]

无限项求和,那 \([x^n]exp(f)\) 不太好定义。

因此通常是 \([x^0]f = 0\),这样有 \(f^k\) 的前 \(k\) 项都是 \(0\)。于是可以推出

\[[x^n]e^f = \sum_{k \ge 0} [x^n]f^k / k! = \sum_{k = 0}^n [x^n] \frac{f^k}{k!} \]

同时,多项式 \(\mathrm{exp}\) 有指数函数相似的性质。

具体计算的话,见下图:

image

和求逆有点像。

对数函数

\(\ln x\),对 \(x = 1\) 泰勒展开是:

image

但这个“多项式”幂的底数不是 \(x\),于是我们也可以用 \(\ln(1 + x)\)

\[\ln(1 + x) = \sum_{k \ge 1} \frac{(-1)^{k - 1}}{k} x^k \]

\(\ln f\) 只对常数项为 \(1\) 的计算。这样最后的 \(f - 1\) 的常数项刚好是 \(0\)

image

\(g'\) 再积分回去,就是 \(g\) 了。

互逆定理

image

幂函数

\(f^k\)\([x^0]f = 1\)

带入互逆定理:

\[f^k = e^{\ln f^k} = e^{k \ln f} \]

这样最快可以 \(O(n \log n)\)

OGF

定义

数列的每一项附上 \(x^k\) 的权值。

简单的例子

上衣裤子鞋子,都有价格,选出总价 \(n\) 元的一套。

总价 \(n\) 元的权值记为 \(x^n\),这样答案就是 \([x^n]f\)

这样三件东西都是个多项式,乘起来完事。

简单的例子 2

变成人民币。

\[\prod \sum_{i \le 0} x^{ik} = \prod \sum_{i \le 0} {x^k}^i = \prod \frac{1}{1 - x^k} \]

多项式快速求逆即可求前 \(n\) 项。

常见数列的生成函数

斐波那契:\(\frac{x}{1 - x - x^2}\)

卡特兰数:\(\frac{1 - \sqrt{1 - 4x}}{2x}\)

EGF

引入的例子

有标号一堆点分成两棵树,不连通,方案数?

一棵树是 \(n^{n - 2}\),我不会矩阵树定理。

最后答案是

image

\(n\) 项要 \(O(n^2)\),但变形一下

image

只要 \(O(n \log n)\) 就行了。

定义

image

好处是可以把 OGF 的二项卷积变成卷积。

带标号森林计数

先枚举树有几棵。参考上面的可以得到:

image

由于树实际是无序的,被我们当有序了,所以要除以 \(k!\)

然后变形:

image

旁边的就是卷积,化掉:

image

左边那个就是 \(e^F\)

\[H = e^F \]

如何具体使用哪种 GF?

插接(有组合数一类),即分成一堆步骤但可以重分配:EGF。

两段直接拼接:OGF。

多项式快速算法

正片启动!

多项式乘法

学过了。

posted @   sihiazi  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示