一

第二期集训开始了,写的精细一点喵qwq

题目链接都是洛谷的链接,因为如果是 CF 或者 AT 的题,洛谷可以看翻译、看题解,洛谷也给出了原题链接。有不懂可以戳我喵。

8.1 最短路构图模型

P5465 [PKUSC2018] 星际穿越

观察题。如果能跳到 \(i\) ,那么一定可以跳到 \(j(i < j)\)。也就是随着 \(x\) 的减小,\(dist(x,y)(x < y)\) 一定单调不降的。这启示我们用倍增处理。又观察到只可能在第一步往右跳,所以特殊处理一下第一步就可以。统计答案的话,在设一个 \(sum_{i,j}\) 表示从 \(i\) 的跳到 \([f_{i,j} , i-1]\) 的距离和。查询答案的时候查分一下就好。

CF1753D The Beach(洛谷链接)

比较显然的观察到,最后对于每个障碍的两端操作后一定有至少一端位于原来的格子位置。把障碍的移动看作空格的移动。就可以轻易的建图了。跑 dij 把所有空格作为起点入队,这样就可以求出每个点到最近的空格的距离 \(dis_u\) 。将地图黑白染色后,空格不会跨颜色移动,所以枚举哪一个 \(1 \times 2\) 会成为答案,两个格子是互不干扰的。两个 \(dis\) 加起来就可以。

P3350 [ZJOI2016] 旅行者

对于平面图求最短路,可以分治做,这个技巧之前也遇到过。感性考虑每一刀都切在长边上,可以使复杂度最小,复杂度证明看题解吧。

CF605E Intergalaxy Trips(洛谷链接)

DP,期望什么的最弱了喵。设 \(dis_u\) 表示从 \(u\) 点到终点的期望天数。如果假设我们已经知道了所有 \(dis_u\),那在 \(u\) 点时,面对一种虫洞开闭的情况,在能前往的点之中(包括自己)一定选一个 \(dis_v\) 最小的 \(v\) 点走。那么我们可以列出方程

\[dis_u = \sum_{i = 1}^{k}\left(\prod_{j = 1}^{i-1} (1-p_{u,j})\right)p_{u,i}(dis_i+1)+\left(\prod_{j = 1}^{k} (1-p_{u,j})\right)(dis_u+1) \]

其中,将所有节点按 \(dis_v\) 从小到大排序,再从 \(1\) 开始编号。最后一个 \(dis_v < dis_u\) 的编号为 \(k\)。上面的式子说的就是前往一个节点,当且仅当比他 \(dis\) 小的节点都去不了。

接下来可以考虑转移顺序了。要算 \(dis_u\),我们需要知道所有 \(dis_v(dis_v < dis_u)\)。初始时我们知道 \(dis_n = 0\)。假设我们已经求出前 \(k\) 小的 \(dis_v\),在剩下的节点中,把第 \(k+1\) 个小的 \(dis_v\) 求出来,把它纳入到已经求好 \(dis\) 的集合中,不断进行下一轮,直到所有点的 \(dis\) 都求出。具体如何求出第 \(k+1\) 小的值呢?把当前的 \(k\) 当作真实的 \(k\),对所有点求出来 \(dis_u'\),最小的那一个,就一定等于真实的 \(dis_u\),而且是未被计算的点中真实 \(dis\) 最小的。因为当前一定有一个是对的,如果不是 \(dis_u'\) 最小的那个 \(u\),而是 \(v\) 的话,就会有 \(dis_u < dis_u' < dis_v'=dis_v\)。而 \(u\) 的排名在 \(v\) 的后面,矛盾。

这和未加优先队列优化的 dijsktra 的思想是相通的。

P3403 跳楼机

接下来的题都是同余最短路,这是模版不解释。

AT_arc084_b [ABC077D] Small Multiple

直接枚举 \(k\) 的倍数显然超时。但我们发现最终的答案一定不会太大。这启示我们可以不断找数位累加和最小的数字。从 \(1\) 开始,要得到所有数字,只用 \(+1\) 或 \(\times 10\),前者让数位和 \(+1\),后者不变。在模 \(k\) 意义下进行,01-bfs 即可。

P9140 [THUPC 2023 初赛] 背包

闲话:想当初还是普及组的小朋友时,也做到了一道背包容量很大的 dp 题,具体题意很遗憾不记得了。当时什么都不会,只能对着那个大的吓人的数据范围发呆。还记得当时最好的朋友依靠容量小时 dp,大的时候贪心地全选价值密度最大的物品(其实很接近正解了)获得了全场最高分。一晃三年过去了,现在他大概已经 AFO,在学文化课了。欲买桂花同载酒,终不似,少年游。

凭直觉价值密度最大要选很多。设其体积为 \(m\),价值为 \(w\)。那么我们之后就要在 \(\mod m\) 的意义下进行。更本质的原因后面解释。

对于两组背包方案 \((V_1,C_1),(V_2,C_2)\),若 $V_1 \equiv V_2 \pmod{m} $,我们要讨论哪一种更优。假设查询是 \(V\),那么答案是 \(C_1+\frac{V - V_1}{m}w = C_1-\left \lfloor \frac{V_1}{m}w \right \rfloor +\left \lfloor \frac{V}{m}w \right \rfloor\)。所以我们可以设状态了: \(f_i\) 表示所有背包方案 \((V , C)\) 中,满足 \(V \equiv i \pmod{m}\),且 \(C-\left \lfloor \frac{V}{m}w \right \rfloor\) 最大的。

一个物品 \((v,c)\),他连出从 \(V\) 到 \((V + v) \mod m\) 的边,有数论基础的可以看出形成 \(\gcd(v,m)\) 个长度为 \(\frac{m}{\gcd(v,m)}\) 的环。普通的 \(dp\) 要转移构成一张 DAG,但是这里成环了,可以选择跑图论里的最长路。但还有更好的做法。注意到虽然有环,但是一个物品我们不会选 \(\frac{m}{\gcd(v,m)}\) 及以上个(即绕了一圈又回到起点),因为这样不如替换为价值密度最大的那个!这也就是为什么要在 \(\mod m\) 的意义下进行。这样所以,对于每一个子环,我们绕着这个环转两圈,即可考虑到所有转移,因为每个点都转移到了子环上其它所有点。

另外,有上述分析知,一个物品不会选 \(\ge m\) 个,那最优方案的 \(V\) 不会超过 \(m^2\)。(其实这里没太看懂,总共有 \(n\) 个物品,那上界不应该是 \(nm^2\) 嘛(小声(各位知道的话请一定告诉我qwq。配合 \(V\ge10^{11}\) 保证了一定会选价值密度最大的物品。

学习的是 Alex_Wei 的这篇题解。

8.2 容斥与反演

写完 day1 要累死了,还是不能写得太精细啊。

二项式反演

\[g(n) = \sum_{i=n}^{N}\binom{N}{i} f(i) \Longleftrightarrow f(n) = \sum_{i=n}^{N}(-1)^{N-i}\binom{N}{i} g(i) \]

形式有很多,没必要死记,只要将 \(f,g\) 换一下,凑一个 \(-1\) 的多少次方就可以。

可以做“钦定”和“恰好”的转化。注意,有的文章把“钦定”说成“至少”或“至多”,这里的“至少”或“至多”不是朴素的,很容易受误导。

设 \(f(k)\) 表示恰好满足 \(k\) 个性质,\(g(k)\) 表示钦定会满足 \(k\) 个性质,其他的不管。通常 \(g(k)\) 是容易求的,我们有

\[g(k)=\sum_{i=k}^{n}\binom{i}{k} f(i) \]

其中系数 \(\binom{i}{k}\) 是满足的 \(i\) 个性质中,哪 \(k\) 是我们钦定的。二项式反演就能求出 \(f(k)\)。

你可能会说既然“ \(g(k)\) 表示钦定会满足 \(k\) 个性质,其他的不管。”这不就是至少嘛,为什么说“至少”不是朴素的?举例子,假设要算 \(g(2)\),钦定 \(1,2\) 满足性质,\(3\) 有可能满足性质,这记录一次答案。钦定 \(1,3\) 满足性质,\(2\) 有可能满足性质,这也记录一次答案。也就是说 \(\left \{ 1,2 \right \},3\) 与 \(\left \{ 1,3 \right \},2\) (括号里表示钦定的)在 \(g(k)\) 里被认为是两个不同的方案,但在朴素的“至少”认知里,这是同一种方案。

哎当时我刚学二项式反演的时候,看到和上面类似的文章就是一知半解,但轮到自己来写也不怎么好。更重要的是自己做题和领悟。


纯二项式反演和数学的题目就不详细讲惹qwq。

P10596 BZOJ2839 集合计数。

CF997C Sky Full of Stars(洛谷链接)

推荐这篇题解。两个维度的二项式反演,还有就是凑一个二项式定理,从 \(O(n^2)\) 降为 \(O(n)\)。


和 dp 结合的题目在下面喵。最大的弱项是 dp 喵,一遇到这种题就死透了qwq

P4859 已经没有什么好害怕的了

学姐又掉头了2333。 (恰好“糖果”比“药片”能量大的组数比“药片”比“糖果”能量大的组数多 \(k\) 组的限制)等价于(“糖果”比“药片”能量大的组数为 \(a = \frac{n + k}{2}\))。容斥改为求钦定有 \(k\) 组“糖果”比“药片”能量大,其他不管,记为 \(g_k\) 。将“糖果”与“药片”按能量排序。接着设 \(dp_{i,j}\) 表示考虑前 \(i\) 个糖果,钦定了 \(j\) 组。对于 \(dp_{i,j}\),如果我要钦定 \(i\),那么能与他配的药片有 \(r_i-(j-1)\),其中 \(r_i\) 表示有多少个药片比糖果 \(i\) 大。\(-(j-1)\) 是因为前面有 \(j-1\) 个配对消耗掉了。\(g_k=dp_{n,k}\times(n-i)!\)。用二项式反演就可以求出“恰好”。这道题 \(O(n^2)\) 可以接受,递推也可。这种递推的方式下下题有用到。

P6478 [NOI Online #2 提高组] 游戏

和上题类似。同样把恰好改为钦定有 \(k\) 个祖先关系。具体的 dp 过程和复杂度证明可以看这篇题解。

CF995F Cowmpany Cowmpensation (洛谷链接)

首先观察到 \(D\) 很大而 n 很小,所以我们可以先求出 \(f(k)\),表示恰好使用数字 \([1,k]\) 分配的方案数。最终的答案就是 $\sum_{k=1}^{n}f(k)\binom{D}{k} $。

再利用容斥将恰好改为只使用 \([1,k]\) 内的数字,并且 \(k\) 一定要用的分配方案数,这个记为 \(g(k)\)。\(g(k)\) 可以轻松 dp 求出。

我们有 \(g(k) = \sum_{i=1}^{k}f(i)\binom{k-1}{i-1}\)。\(\binom{k-1}{i-1}\) 是因为 \([1,i]\) 中最大的那个数 \(i\) 一定要分给 \(k\)。所以我们发现这不能用二项式反演解决。但是我们这道题 \(n=3000\) ,而且我们要求出所有的 \(f(k)\)。所以我们可以递推的解决。将上述式子中 \(f(i)(1\le i \le k-1)\) 移到右边,我们有

\[g(k)-\sum_{i=1}^{k-1}f(i)\binom{k-1}{i-1} = f(k) \]

于是我们可以从小到大求出所有 \(f(i)\) 了。

子集反演

\[g(S) = \sum_{T \subseteq S} f(T) \Longleftrightarrow f(S) = \sum_{T \subseteq S} (-1)^{\left | S \right | -\left | T \right |} g(T) \]

子集反演里的至多至少是真的,所以前面没有组合数的容斥系数。枚举子集的复杂度是 \(O(2^n)\) 的,所以数据范围都开的很小,比较好辨认。

P3813 [FJOI2017] 矩阵填数

下面的 \(S\) 表示一个由子矩阵组成的集合。

\(f(S)\) 表示属于 \(S\) 的子矩阵的最大值 \(\le v\)(可以小于或等于),其他的子矩阵 \(<v\) 的方案数。加一个离散化,这个 \(f(S)\) 是好求的。

\(g(S)\) 表示属于 \(S\) 的子矩阵的最大值 \(=v\),其他的子矩阵 \(<v\) 的方案数。我们要求的答案就是 \(g(\left \{1,2...n \right \} )\)。

我们有关系:

\[f(S) = \sum_{T \subseteq S} g(T) \]

反演就可以求出 \(g(S)\)。

P3349 [ZJOI2016] 小星星

直接设计状态 \(dp_{i,j,S}\) 表示 \(i\) 的映射是 \(j\),\(i\) 子树内所有点的映射是集合 \(S\)。转移时要要枚举 \(S\) 的子集,复杂度是 \(O(n^33^n)\) 的。话说这个枚举子集从来没了解过喵,有空学一下。

显然我们不应该枚举子集,考虑改变状态。枚举子集是因为要保证每个点的映射互不相同。dp 时把这个限制去掉,最后在容斥。\(dp_{i,j,S}\) 表示 \(i\) 的映射是 \(j\),\(i\) 子树内所有点的映射只能选集合 \(S\) 中的点。这样 dp 就可以轻松做。

\(g(S)\) 表示树上所有点只能选图上 \(S\) 集合内的点作为映射的方案数。

\(f(S)\) 表示树上所有点恰好选图上 \(S\) 集合内的点作为映射的方案数。我们要求的答案就是 \(f(\left \{1,2...n \right \} )\)。

\[g(S) = \sum_{i \in S} dp_{1,i,S} \]

我们还有关系

\[g(S) = \sum_{T \subseteq S} f(T) \]

反演就可以求出 \(f(S)\)。

之后还有一道与矩阵树定理结合的,在下面。

min-max 容斥

\[\max_{i \in S} x_i = \sum_{T \subseteq S} (-1)^{\left | T \right | -1} \min_{j \in T} x_j \]

以及期望的形式

\[E(\max_{i \in S} x_i) = \sum_{T \subseteq S} (-1)^{\left | T \right | -1} E(\min_{j \in T} x_j) \]

\(\min\) 和 \(\max\) 调换也是可以的。第二个期望的式子特别有用。证明先咕着,以后再说吧,感觉这个 \((-1)^{\left | T \right | -1}\) 的系数不是特别符合直觉啊。

AT_abc242_h [ABC242Ex] Random Painting

先用 min-max 容斥将最大值的期望转成最小值的期望。然后我们发现最小值的期望是很好算的,假设有 \(k\) 个区间与 \(T\) 有交集,那么最小值的期望就是第一次选到了这 \(k\) 个区间的期望次数, 式子列一下。

\[E = \frac{k}{m} + (E + 1)(1-\frac{k}{m}) \]

得到 \(E = \frac{m}{k}\)。要枚举的子集 \(T\) 数量很多,不可能都枚举出来。但是期望的计算只和与它相交的区间的数量有关,所以 dp 一下,求出与 \(k\) 个区间有交集的集合有多少个就可以。

8.3 线性代数基础

矩阵树定理

这辈子不会在正式考试上遇到了。它可以求一个图生成树的数量。

对于无向图,定义一个 Laplace 矩阵。

\(D_{i,i} = deg(i)\),\(D_{i,j}\) 为 \(i,j\) 之间边的数量的负数。其实就是度数矩阵减去邻接矩阵。

这个图生成树的数量,是去掉任意一行 \(i\) 和列 \(i\) 后的矩阵的行列式的值。去掉 \(i\) 行和列的意义是以 \(i\) 作为根节点,而无向图选谁作为根节点都一样,所以去掉的 \(i\) 是什么没区别。

对于有向图,根向生成树是树上所有边都指向根的树,叶向生成树同理。

若要求以 \(k\) 为根结点的根向生成树,那么我们的 Laplace 矩阵的定义是

\(D_{i,i} = degout(i)\),\(D_{i,j}\) 是 \(i,j\) 之间边的数量的负数。

其实就是把度数改为出度数啦。然后把这个矩阵的第 \(k\) 行和列去掉,再算它行列式的值就可以了。叶向有根树同理。

证明不会,原谅我的肤浅qwq

上述做法介绍了如何求生成树的方案数。但是更加本质的是,如果一条边的权值是 \(w\),那么把度数矩阵改为相邻边的权值和,邻接矩阵改为连接这两点的所有边的权值和。按上述算法得出来的值,是所有生成树边权乘积的总和。写成式子可能更方便理解:

\[\sum_{T} \prod_{e \in T} w(e) \]

在求生成树数量时,我们把所有边的权值赋成 \(1\)。这样 Laplace 矩阵就特化变成了度数矩阵减去邻接矩阵,最后给出的行列式的值也就变为了 \(\sum\limits_{T} \prod\limits_{e \in T} w(e) = \sum\limits_{T} \prod\limits_{e \in T} 1 = \sum\limits_{T} 1\),即生成树的个数。

P6178 【模板】Matrix-Tree 定理


甚至,我们可以把边权改为一个多项式,这也是成立的。

P6624 [省选联考 2020 A 卷] 作业题

以这道题为例,首先我们卷积卷掉 \(\gcd\)。

\[\begin{eqnarray} ans &=&\sum_{T}\left(\sum\limits_{e \in T} w_{e}\right) \times \gcd_{e \in T}(w_{e}) \\ &=&\sum_{T}\left(\sum\limits_{e \in T} w_{e}\right) \times \sum_{d \mid \gcd_{e \in T}(w_{e})} \varphi (d) \\ &=&\sum_d \varphi(d) \sum_{d \mid w_e,e \in T} \left(\sum\limits_{e \in T} w_{e}\right) \end{eqnarray} \]

这部分是数论函数,狄利克雷卷积和莫比乌斯反演的内容,不赘述。

枚举 \(d\),只考虑 \(d \mid w_e\) 的边。现在问题变成了求

\[\sum_T \left(\sum_{e \in T} w_{e}\right) \]

我们发现,一般的矩阵树定理求的是 \(\prod\limits_{e \in T} w_{e}\),不能求连和。最巧妙的一步是,我们把矩阵里边的权值写成 \(w_ex+1\) 的多项式。忽略高于一次的项,那么 \((w_{e_1}x+1)(w_{e_2}x+1) = (w_{e_1}+w_{e_2})x+1\)。这样我们利用多项式,使连乘有了连加的效果。最后的答案就是一次项的系数。

注意,在求行列式的值时,一般的做法是通过加减将矩阵化为上三角矩阵,即下三角都是 \(0\)。而在多项式里,与 \(0\) 具有相同效果的多项式是 \(0x+0\)(这个可能叫单位元?不太清楚了)。需要多项式除法,具体地,

\[\frac{a+bx}{c+dx}=\frac{a}{c}+\frac{bc-ad}{c^2}x \]

把 \(c+dx\) 乘到右边就可以验证它的正确性,怎么来的不知道,因为多项式完全没学过呢,这是第一次接触有关多项式的题目。


P4336 [SHOI2016] 黑暗前的幻想乡

本题中集合的元素是建筑公司。

设 \(g(S)\) 为只使用 \(S\) 内的建筑公司修路有多少种方案。\(f(S)\) 为 \(S\) 内的建筑公司全部使用的方案数。

\[g(S) = \sum_{T \subseteq S} f(T) \Longrightarrow f(S) = \sum_{T \subseteq S} (-1)^{\left | S \right | -\left | T \right |} g(T) \]

\(g(T)\) 通过矩阵树定理就可以求。

LGV 引理

这个是根本没有学会吧,对着题解勉强战胜一道题。

AT_abc216_h [ABC216H] Random Robots

8.4 异或线性基

异或线性基

常规的操作没什么好说的,新学会了简化线性基。

下文中的 \(i\) 指的都是二进制的第几位。将线性基进一步简化,对于每个 \(i\),用最高位为 \(i\) 的数异或上其他所有第 \(i\) 位非零的数。如此操作之后,对于每个 \(i\),如果存在 \(v_i\),则其他数第 \(i\) 位一定是 \(0\)。

设简化后的基为 \(B = {v_0,v_1,v_2,\dots,v_k}\),那么 \(B\) 能表示的所有数从小到大排序是

\[0,v_0,v_1,v_0\oplus v_1,v_2,v_0\oplus v_2,\dots,v_0\oplus v_1\oplus v_2\oplus \dots\oplus v_k \]

应该好理解的qwq

LOJ k 大异或和

简化线性基就可以了,对 \(k\) 二进制分解。注意这道题要求不能不选数,也就是 \(0\) 不能通过不选数的方式得到。注意讨论这一点。

P4570 [BJWC2011] 元素

贪心的想,按贡献从小到大加入,如果能加就加,不能加就不加。云浅的 ppt 里说,“事实上,向量空间和它的线性无关子集构成拟阵,因此贪心正确”。完全看不懂啊=w=。我的理解是,显然,得到的线性基大小是最大的,而按值域从大到小插可以使最优(这句话也没有解释清楚哦,虽然我确信我已经会了,但是实在是不好解释awa各位感性理解吧)。


线性基的经典应用是图上的异或路径。一个点可以走出去,绕着环转一圈在回来,贡献只有环的贡献。把所有简单环塞入线性基,但是简单环有很多;建立生成树,把反组边(无向图没有横叉边)与树边成的环加入线性基即可,明显这些环可以异或出所有环。求最大异或路径,可以随便一条路线,再在线性基里查出最大值就可以

P4151 [WC2011] 最大 XOR 和路径

板题吧,用上述方法就可以。

P14994 异或最短路和

这篇题解写的很好,这里只解释一下关键性质。\(F(d_u \oplus d_v)= F(d_u) \oplus F(d_v)\) 不太容易观察出来,不过证明很简单。考虑在简化线性基中,如果 \(x\) 的第 \(i\) 为 \(1\),那我们就要选上线性基里最高位为 \(i\) 的数,当然如果亦或线性基里没有就不选。按位考虑,对于第 \(i\) 位,如果 \(d_u,d_v\) 都是 \(1\),则 \(F(d_u \oplus d_v)\) 不会选,\(F(d_u) \oplus F(d_v)\) 里则会被选两次而异或掉,相当于不选。同理考虑其他 \(3\) 种情况,都是一样的。

最后要求 \(\sum\limits_{i}\sum\limits_{j}(a_i \oplus a_j)\),仍然是按位考虑。由此可见按位考虑真是很重要。


UOJ 赵云八卦阵

这道题听懂了但是代码总是错,调不出来了,就这样放着吧。具体思路是,由亦或的性质观察到,每个 \(a_i\) 的取值是它自身再亦或上前面任意的数。把 \(a_i\) 依次加入基中,如果它使基的大小改变了,就称它为关键点。显然关键点只有 \(\log V\) 个。非关键点原本自身的数可以由前面的某些数亦或得到,所以对于非关键点 \(a_i\) 来说,选他作为 LIS 一定比选 \(a_j(j<i)\) 优。于是我们知道了,最后作为 LIS 的点形如下图:

****!*****!*****!*******!****!***********!*********!*****!****
xxxxxxxxxxxxxxxxxxxx----x----x---------------------x----------

其中第一行的 * 表示非关键点,! 表示关键点。第二行的 x 表示不选,-表示选。也就是:非关键点会选一个后缀;关键点如果在这个后缀里能选或不选,如果在外面则一定不选。有了这个比较强的限制就可以 dp 了。

设关键点的位置是 \(p_1,p_2,\dots,p_m\),\(dp_{i,j}\) 表示考虑 \([p_i,n]\) 的位置,关键点中有 \(j\) 个在 LIS 上,LIS 开头元素的最大值。

设 \(B_i\) 表示 \(a_{[1,i]}\) 所有点组成的线性基。从 \(dp_{i+1,j}\) 转移到 \(dp_i,j\) 或 \(dp_{i,j+1}\),相当于加入一段非关键点,再加入一个关键点。查出 \(dp_{i+1,j}\) 在 \(B_{p_{i+1}-1}\) 内的排名,再将排名减去区间长度 \(p_{i+1}-p_i-1\),将这个排名再放到 \(B\) 查出数,得到的就是位置是 \(p_i+1\) 的点能取到的最大值。这要求线性基支持由数查排名,由排名查数。亦或线性基就能做。

接着我们要考虑选 \(a_{p_i}\) 的话 \(a_{p_i}\) 能取多大的值。这个问题就是:给定 \(x,y\),问在 \(<y\) 的前提下,\(x\) 与线性基中亦或能取多大。结论是:

  • 从小到大考虑简化线性基里的数,如果 \(x\) 亦或上它能变小就亦或。

  • 从小到大考虑简化线性基里的数,如果 \(x\) 亦或上它还是小于 \(y\) 就亦或。

证明我暂时不会,参考题解的这篇也没有讲。细节还是很多的,导致现在还没调过 /dk

CF1100F Ivan and Burgers

其实就是问 \(i \in [l,r]\) 的 \(a_i\) 能亦或出来的数最大是多少。

写博客时回头看这道题第一反应是线段树维护线性基,但是这样是三只 \(\log\) 的,非常无法通过。

正确做法是,先扫描 \(r\),然后我们发现随着 \(a_i\) 的加入,让更晚加入的数占据更高的位置一定是更优的。于是我们在插入的过程中不断交换,让 \(pos\) 更小的放在低位就可以了。

提高考试

T2 P9100 [PA 2020] Miny

难点在于设计 dp 状态。设 \(dp_i\) 表示考虑前 \(i\) 个地雷,且第 \(i\) 个地雷没有引爆的方案的数。这样的好处是我们保证了引爆 \(i\) 前面的地雷不会影响到 \(i\) 之后的地雷,满足了无后效性。接着就好做了。

枚举上一个没有引爆的地雷 \(j\),如果将 \([j+1,i-1]\) 的地雷全部引爆都没有炸到 \(j\) 和 \(i\) 那这个转移就是合法的。

设 \(lid_i\) 表示最左的前缀 \([lid_i,i-1]\) 炸不到 \(i\),\(rid_i\) 表示最右的前缀 \([i+1,rid_i]\) 炸不到 \(i\)。那么这个转移合法的条件就是:\(rid_j \ge i\) 且 \(lid_i \le j\)。转移方程写出来:

\[dp_i = \sum_{j=lid_i}^{i-1}[rid_j \ge i] dp_j \]

差分搞一下,把询问挂到 \(i-1\) 和 \(lid_i-1\) 上。于是限制就只有 \(rid_j\ge i\) 了。树状数组维护即可。

T3 P15133 [ROIR 2026] 最后的滑动窗口问题

一个普适的技巧是将坐标轴倾斜,对于一个点 \((x,y)\),它在新的坐标系中的坐标是 \((x,x+y)\)。用树套树来维护这个新的坐标系,这样我们可以用矩阵操作维护原本平行四边形或三角形的操作。

具体是下面这个图:

--------------------------------------->y轴
|        *
|       *
|      *
|     *
|    *
|   *
|  *
| *
|*
|
|
|
x轴

* 表示一条斜率为 \(-1\) 的线。由于行高和字宽不同,所以看着不太对。设这条线的截距是 \(b\)(\(x,y\) 轴的结截距是一样的)。那么一个点 (x,y) 在这条线的上方的充要条件是 \(x \le b,x+y\le b\)。把 \((x,x+y)\) 看作新的坐标,那么对三角形的操作就转化到矩阵上了。

另外一个很好的思想是将区间问题转化到平面上,用平面上的点表示一个区间。两个坐标轴可以表示 \(L,R\) 左右端点,也可以表示 \(L\) 左端点,和区间长度 \(len\)。因为这道题规定了区间长度,选择后一种表示方式。NOIP2025T4 就是第一种表示方法。

推荐这篇题解喵,写得很清楚了。P6881 [JOI 2020 Final] 火灾 / Fire 是双倍经验。稍微改一点就过了。谁不愿意多过两道黑体呢。

T4 P9331 [JOIST 2023] 护照 / Passport

咕咕咕。

8.5 循环计数与计数 DP

这一部分不太熟练呢。

连续段 DP

练习了一些连续段 dp 的内容。感觉这个东西的精髓是按大小考虑数,然后贡献提前计算,具体的理解不是很深刻。就只放一下题好了。

P9084 [PA 2018] Skwarki

P9197 [JOI Open 2016] 摩天大楼 / Skyscraper

P10547 [THUPC 2024 决赛] 排列游戏

Burnside 引理和 Pólya

群论也学不明白呢,尽量通俗的说一下。这个东西是用来求本质不同的方案个数的。比如给一个四元环黑白染色,那么 WBBW 和 BBWW 就是本质相同的。我们发现,两个方案本质相同,就是能通过一些操作使它们完全相同。比如上面那个例子里 WBBW 向左移一位就得到了 BBWW。我们把所有操作写出来,记为一个集合 \(G\),\(g\) 表示某个操作。在上面四元环的例子里,所有操作就是不动,右移一位,右移两位,右移三位。我们记某个染色方案是 \(x\),所有染色方案的集合用 \(X\) 表示。\(gx\) 表示在一个操作 \(g\) 作用于 \(x\) 后得到的新的染色方案。一个操作 \(g\) 的不动点是,所有被 \(g\) 作用还等于它自身的方案,用集合 \(X^g\) 表示。也就是说

\[X^g=\{x\in X : gx=x\} \]

Burnside 引理告诉我们,本质不同的方案数(记为 $\left | X/G \right | $)就是

\[\left | X/G \right |=\frac{1}{|G|}\sum_{g\in G}|X^g| \]

用中文表述,就是所有操作的不动点个数的平均数。

上面简单介绍了 Burnside 的引理,Pólya 可以看作是一般性的 Burnside 引理在染色计数问题上的应用,自己想想也会了。略去了所有和做 OI 题无关的内容以及证明(<-其实就是这个彩笔没有学会)。希望各位能够去自行详细了解 Burnside 怎么证明。

接下来是题目。这些题不看题解的话我基本没有独立推出式子的风险呜呜呜呜。

P4980 【模板】Pólya 定理

P1446 [HNOI2008] Cards

P4128 [SHOI2006] 有色图

8.6

模拟考

T2 P4111 [HEOI2015] 小 Z 的房间

完全是矩阵树模版,但是赛时 all in T3 了甚至连题面都没怎么看。获得了暴力 10 分。

T3 P3733 [HAOI2017] 八纵八横

思路简单,赛时不会bitset没有切。先随便选初始边作为树边,注意到树边不会被删掉。加边相当于向线性基里加一个数,删边相当于删除一个数,查询相当于查线性基能拼出的最大值。线段树分治搞一下,删除改撤销,\(O(len\times q\log q)\)。bitset 搞一下,\(O(\frac{len\times q\log q}{w})\)。

posted @ 2026-09-29 11:26  Natho_nA  阅读(7)  评论(0)    收藏  举报