十月模拟赛

10.3

T3

序列修改

在时间轴上考虑,相当于每个时间除了自己该有的还能额外带上 \(k - 1\) 个东西。则对于每个数,将每两个相邻的出现中间视为一条线段,则希望选出一些线段满足每个位置被覆盖不超过 \(k - 1\) 次,并且费用最大。经典建模,建一条数轴,源向第一个点连流量 \(k - 1\),每条线段起点向终点连流量 \(1\),费用为其代价的边。最大费用最大流即可。通过 \(S \rightarrow 1\) 的边限制了每个时刻被覆盖次数 \(\le k - 1\)

T4

将子段归零

要求 \(\max \{ \#(a_i \le x) - x \}\)发现很像霍尔定理的形式,于是转化为二分图匹配问题。由于这里匹配的特殊性,可以直接贪心。每次新加入一个东西的时候,如果可以匹配,则直接匹配。否则踢掉位置最小的匹配的 \(a_i\),换上新的东西。判断匹配也用霍尔定理,然后再开一棵线段树维护每个 \(a_i\) 是否匹配即可。

10.4

T3

魔法

形成路径,等价于连通且每个点度数不超过 \(2\)。连通性只需要把每个点向父亲连边,若点集只有一条连向点集之外的边则连通。而度数不超过 \(2\),考虑维护从小往大加点时每个点第一次度数超过 \(2\) 的时间。每个点度数超过 \(2\) 有两种情况,一种是选了三个儿子,一种是两个儿子一个父亲。三个儿子容易统计,两个儿子一个父亲的情况,由于每次更新父亲的时候需要暴力儿子,但儿子其实没有发生变化,于是把这种情况挂到父亲上统计。这样就能快速完成更新了,每次只需要更新常数个点。而对于连通性,注意到如果一个父亲下面有超过两个儿子,则第三小的儿子造成的限制没有用,因为它限制的时刻已经被前两小的儿子限制死了。因此只需要对每个点维护最小的两个儿子的连边即可。

  • 我咋这都不会做?

T4

防御塔

注意到至少一对相对的方向只会各自选一个矩形。显然。不妨假设左上-右下各只选一个,则可以预处理这两类矩形分别覆盖了什么。然后枚举纵坐标最靠上的一个左下矩形,然后贪心选交它的纵坐标最靠下的右上矩形,然后再贪心选交它的横坐标最靠右的左下矩形,依此类推。可以用记忆化搜索写。但是由于最开始选的右上矩形和左下矩形的左上空白无法被左上矩形覆盖,因此需要额外选一个。这样就做完了。

  • 第一步观察,即使显然。

10.7

T2

数据结构

考虑二分答案,每次 check 需要检查区间是否存在比某个数大的数。若不带修可以直接从小到大加数可持久化线段树维护,带修就直接\(x\) 的线段树的 \([l, r]\) 区间贴到 \(x + 1\)\([l, r]\) 区间上就好。注意贴上去的过程中被贴的线段树所有被修改的节点都需要可持久化,否则会出问题。

T4

树据结构

树剖套可持久化线段树维护修改,链查拆成到根链查,子树查用定期重构,每次重构更新版本树的子树和,散块暴力检查即可。

10.8

T3

数据结构题

显然的事实是交也是值域连续的区间。考虑枚举交的右端点 \(x\),并假设右边比中间大。此时我们考察右端点往右这一块,起点为 \(x + 1\) 的最长值域连续段。由于这个段已经占据了这个值域区间,因此中间的交要是想和右边拼起来,则其必须包含这个最长值域连续段中的 \(\min - 1\)。那么在以 \(x\) 为右端点的所有包含 \(\min - 1\) 的值域连续区间中,显然我们任选两个出来作为左边的左端点和交的左端点都是合法的。于是做完了。

T4

图森破

条件即为 \(X\) 为自身的最小循环表示。发现所有最小整周期为 \(|X|\) 的串 \(X\),它们所有循环表示不同,因此具有唯一的最小循环表示。因此只需要计算长度为 \(n\) 的最小整周期为 \(n\) 的数的个数。设为 \(f_n\),则显然 \(10^n = \sum\limits_{d | n}f_d\)。莫反即得 \(f_n = \sum\limits_{d | n} \mu(\frac n d)10^d\)。于是答案为 \(\sum\limits_{n}\sum\limits_{d | n}n\mu(\frac{n}{d})10^d\)。将 \(n\) 拆开,得 \(\sum\limits_{n}\sum\limits_{d | n}\frac{n}{d}\mu(\frac{n}{d})10^dd\),即 \(\sum\limits_{d}10^dd\sum\limits_{i = 1}^{n / d}i\mu(i)\)。后面的杜教筛,前面的数论分块即可。其前缀和是好求的。

10.10

T2

过半数

对每个绝对众数 \(x\) 计算答案。将 \(x\) 视为 \(1\),别的视为 \(-1\),则我们要求前缀和序列中的顺序对数。数据结构维护即可 \(1\log\)由于所有的总升高次数是线性的,因此考虑拿这个来均摊。扫到每个位置的时候,维护前面的前缀和的最小值,记为 \(minval\)。若当前要减少 \(x\),如果没有减过 \(minval\),则暴力减,因为这里减掉的都可以用前面的加来均摊。而若减过了,则显然不会产生贡献,直接一次减完。而对于中间的数的出现次数的维护,只需要在后面加回来的时候判一下设为 \(1\) 就好了。

10.11

T3

颜色

子树外容易,现在需要支持链加和查询儿子信息和。考虑将每个点的儿子分为重儿子和轻儿子维护。对于轻儿子,每次修改的时候跳重链,就把链顶父亲的轻儿子贡献更新一下。对于重儿子,每次查的时候直接访问即可。

  • 写代码一定要注意特殊情况,如把原本颜色改成原本颜色。

T4

线下见面

考虑若存在 \(u, v, w\) 满足 \((u, v), (v, w)\) 有边,\((u, w)\) 无边,则若 \(v\) 空,我们可以让 \(u, w\) 通过操作 \((u, v, w)\) 变成空的。

先考虑树的情况。任意找到这样的一个结构,并以 \(u\) 为根。先用 \(v\) dfs 一遍整棵树,这样即使 \(v\) 一开始不是空的也已经相遇过了。因此可以视为空的。接下来清空 \(u\)\(w\)。接下来我们可以清空所有第二层点。我们先把 \(v\) 上的东西移到 \(w\),然后用这个点和 \(u\) 操作,然后再 \((u, v, w)\) 就好。那么现在清空了第二层。

然后从上往下清空所有偶数层。设当前点为 \(x\)。由于祖父为空,因此通过 \((fa_x, fa_{fa_x})\)\((x, fa_x, fa_{fa_x})\) 两步操作可以将 \(x\) 移到父亲。

然后从下往上清空所有奇数层。由于父亲为空,因此通过 \((x, fa_x, fa_{fa_x})\)\((fa_x, fa_{fa_x})\) 两步操作即可将自己扔到祖父。

这样整棵树就全部汇集到根了。

而对于图,若非完全图则可以找到 \((u, v, w)\) 的结构。然后我们希望找到一棵生成树,满足每个点和其祖父没有边。不难发现 bfs 树满足这样的性质。于是拎出以 \(u\) 为根的 bfs 树套上面的做法即可。而完全图是容易做的,只需要轮流操作 \((1, 2), (3, 4) \cdots\)\((2, 3), (4, 5), \cdots\) 即可。

  • 希望获得一个空点,于是凭空创造了等效的空点 \(v\)

  • 逐层清空。

一步都想不到啊。

10.13

T1

压缩表格

出现在相同行列的相同元素直接合并,对于已经填的东西将其对当前元素离散化后的值的约束取 \(\max\) 再加一即得当前元素的值。

T3

闷声刷大题

wqs 二分之后反悔贪心 check。具体地,从后往前加入 \(a_i\),每次的决策是匹配一个新的 \(b_i\),或者换掉一个之前已经匹配的 \((a_j, b_k)\)。可以证明当采取第二种决策时拆掉原本的匹配之后被解放的 \(b_k\) 一定还会在这一轮作为最优决策和 \(a_i\) 配对。总复杂度 \(2\log\)

  • 没有 clear 的 STL,最好每次用都新开一个,不然清空会多常数。

T4

时钟装置

首先无论如何容易发现只有那些不同时存在于新树和原树的边是需要被操作的,而答案也就是这种边的数量(除以二)。然后考虑构造。首先先把原树和新树都有的边缩连通块,然后只需要每次断掉一个叶子连通块向上的连边,并将其中的任意一条还没连的新树边连上即可。可以启发式合并维护每个连通块的未连边。

  • 缩连通块。从叶子考虑。

10.14

T4

航空系统

  • 补图上一些连通性之类东西的处理。

10.17

T1

布谷鸟

  • 想题一定要用脑子。要考虑到所有情况。

T2

航拍

  • 会了做法可以不急着写,而是想想有无可以优化的地方。

T3

哥谭市

分块,预处理所有左端点或右端点为 \(B\) 的倍数的区间的答案,最后答案就是 \([L_{id_l + 1}, r] + [l, R_{id_r - 1}]\) 再加两边散块。

  • 分块小技巧。

10.20

T3

望乡台

  • SAM 求子串排名要建反串 SAM!!!

T4

翻修道路

类似最小斯坦纳树的 dp,\(f_{i, j, S}\) 表示当前根 \(i\)\(j\) 条翻修边,包含了 \(S\) 关键点。同 \(S\) 之内 dijkstra,不同 \(S\) 枚举子集合并两边。暴力做是 \(m^2\) 的,但是由于这里 dp 随第二维单调,而合并的卷积是 \(\max \{ f_i, g_j \} \rightarrow h_{\max(i, j)}\),因此可以直接由单调性优化到 \(\mathcal{O}(m)\) 单次合并。

  • \((f_i, f_j) \rightarrow f_{\max(i, j)}\) 的卷积,性质很好,很容易优化。

  • 单调不一定凸,凸也不一定单调。不是一个概念。但都有可以用于优化的性质。

10.21

T2

特产聚会

颜色很少,那么求出每种颜色能给哪些人拿。如果视为二分图,则二分答案之后转化为二分图多重匹配问题。考虑对人拆点用霍尔定理,则对于任意人的子集,能够被这子集中任意一人取到的颜色的数量和不能少于 \(\text{popcount} \times ans\)。而要求这个数量和只需要一个高维前缀和就可以了。

  • 拆点,霍尔定理。

T3

集合魔术

  • 两个凸函数最多只有两个交点。

10.24

T1

旋转排列

  • \(n\) 个点排成环的方案数是 \((n - 1)!\),也就是长度为 \(n\) 的只有一个置换环的排列数量。

  • 错排的递推式:\(f_n = (n - 1)(f_{n - 1} + f_{n - 2})\)

T2

树的期望深度

定义状态为 \(f_{i, j}\) 表示大小\(i\) 的子树,深度为 \(j\) 的概率。转移时合并两棵子树,考虑从小往大给两棵树分配编号。由于当编号变化时,需要每个点维持当前的父亲不变的概率,因此提前预处理出 \(g_{i, j}\) 表示左边加了 \(i\) 个点,右边 \(j\) 个点时,原来的两棵树合并之后形态不变的概率。然后 \(f\) 的转移就是平凡的了。

  • 场上一直想状态为编号\(i\) 的子树期望深度,但根本没法做。本来以为第一维记大小信息不够,但其实概率可以之后再修改。

T3

苹果树

假设可以求出询问时每个点子树每种颜色的出现次数,我们考虑判定转计数。我们计数最终凑出来 \(w\) 的方案数(取模,因此本质是哈希)。每个颜色有限制,容斥掉。容斥之后剩下的就是完全背包了,可以最开始预处理。而要求子树颜色出现次数,可以平衡树维护欧拉序,也可以直接定期重构。都能过。

T4

前缀和数组

考虑 \(k = 1\)。要求的东西很抽象,考虑组合意义:颜色为 \(1\)\(n\) 的小球分别有 \(a_1, a_2, \cdots a_n\) 个,将所有球放在一块随机重排,记最终每个颜色的球最后一次出现的位置为 \(p_i\),则列出 \(p\) 单调递增的概率并对某种 \(a\) 的所有排列求和,稍微移项就会发现所求等于 \(\frac{1}{\prod a_i}\)。于是就只需要平凡的 dp 就可以了。

\(k = 2\) 也差不多,只不过要枚举 \(a_1\) 是什么。为了保证 \(a_1\)\(a_1\),需要它的所有球的最后一次出现比其他颜色球的最后一次出现都靠前。这不太好做,考虑容斥掉,钦定一些东西在 \(a_1\) 之前。然后就可以直接对着值域带容斥系数 dp 了,过程中记录是否已经选过 \(a_1\) 即可规避对 \(a_1\) 的枚举。

  • \(k = 1\) 时的组合意义。

10.25

T1

还原图

  • \(n\) 个点(\(n\) 偶数)两两配对的方案数:\((n - 1)!!\),考虑每次给最小的未匹配点选匹配。

T4

点点的计算

无论如何观察到答案为 \(\text{lcm}(i - k + 1, i - k + 2, \cdots, i)\)。考虑分块,预处理左右端点都为 \(B\) 的倍数的区间的答案,然后只需要每次往两边扩展就可以了。扩展是容易的,只需要维护当前 \(\text{lcm}\) 在每个质因子处的幂次然后每次加入时检查是否能更新即可。

10.27

T1

异或和

考虑拆位,可以证明 \(f\) 值即为所有 \(a_i\) 的按位或乘以 \(2^{n - 1}\)。然后发现一堆 \([l, r]\) 中数的按位或都可以只用两个数构造出来。然后分类讨论每一段值是否能构造即可。

  • 怎么做到异或问题不想拆位的???

T2

构造

考虑每次归位最小的数,但在往前移的过程中可能提前归为一些前面的数。具体地,\(p_i = i + 1\) 的数会被提前归位。于是把所有这样的数构成的连续段统一往前移一位即可。最开头一段就不用动了。

但是这个东西真能保证不超过 \(\frac{n(n - 1)}{2}\) 吗???

T3

松鼠公司

考虑直接 dp,\(f_{i, j}\) 表示 \(i\) 子树内以 \(j\) 为左端点时的最小右端点。每次转移暴力枚举儿子的一个区间作为最左段,然后状压往后扔东西。然后只需要每次做完之后把包含别的区间的区间扔掉,就可以证明复杂度是对的。因为可以发现每个点的每个区间至少有一个端点是来自轻儿子的,只需要将其视为轻儿子贡献上来的东西就可以根据启发式合并的复杂度证明这一部分总共是一个 \(\log\) 的。

  • 看似暴力东西的复杂度证明。

T4

树上的游戏

首先先手必放在直径中点,若中点在边上就必败。然后考虑枚举后手放在哪。然后两人的行动就是一段相向而行,然后一个人拐进侧链。一个人拐进侧链就是当且仅当这条侧链中可以走的长度比另一个人接下来无论如何走能走的长度都更长。然后补的做法就是假的了。真做法还没看。

10.28

T1

最小生成树

首先容易调整证明每加入一种权值的边,这种权值合并出来的连通块只有一个。然后大概可以猜测一定存在一棵 MST 是链,并且所有边的权值形如若给每个点赋上权值,则一条边的权值是两边权值的 \(\max\)。假设点权按从 \(1 \rigtarrow n\) 的顺序升序,那么显然的贪心是把前若干点连成完全图。只要边的数量没有超过 \((n - 1)(n - 2) / 2 + 1\),则可以做到只有一条非 \(1\) 权的边。否则需要考虑剩余权值的分配。初始先把所有点权设为 \(1\),之后每次分配 \(n - 1\) 个权值。将这 \(n - 1\) 个权值要么全部扔给最后一个点,要么均摊给所有 \(n - 1\) 个点,两者取优。剩下的权值也是在全给最后和均摊给后那么多个中取优。这样就做完了。

  • 想题一定要有条理,要动脑子。

T3

归并排序

  • 保证 \(x < y\) 的二维数点:\(n - \#[y_j < x_i] - \#[x_j > y_i]\)。不需要任何二维数据结构。

T4

排列橱柜

考虑差分数组,则 \(w_i = \max \{ |d_i|, |d_{i + 1}|, |d_{i} + d_{i + 1}| \}\)。于是直接 \(f_{i, j}\) 表示前 \(i\) 个,最后一个差分是 \(j\) 是否可行。对着转移瞪眼可以发现每层转移之后合法数构成的连续段不会增多超过一个,而且变化形式也很简单。于是直接用什么东西维护一下所有合法连续段就可以了。构造方案也可以根据转移倒推。

  • 据说写暴力并观察暴力代码就可以想到考虑差分?那看来可能还是要写点暴力。

10.29

T1

括号匹配

先把给定的括号匹配完,剩下的一定是一堆前括号加一堆后括号,还有问号穿插的形式。先把前面的问号尽量匹配掉前括号,再把后面的问号尽量匹配掉后括号,剩下的问号交替即可。

也可以反悔贪心,每次遇到一个问号,要是前面有未匹配的前括号就做后括号,否则做前括号。遇到一个后括号,如果前面有还剩的前括号就匹配,否则考虑前面如果有问号变成的后括号,就把这个问号反悔成前括号来和自己匹配,还能多一个前括号。

  • 反悔。

T3

排列相似度

\(a_i \rightarrow b_i\),则得到环和链。已经给定的环不用管,而链有四种,分别是开头 \(0 / x\),结尾 \(0 / x\)。而我们现在要把链接成环,那么唯一的要求就是两个 \(0\) 不能接到一块。于是考虑依次插入每种链。先把没限制的 \(x \rightarrow x\) 链摆好,\(f_{i}\) 表示当前拼成 \(i\) 个环的方案数。初始 \(f_i = { \#(x \rightarrow x) \brack i}\)(第一类斯特林数)。接下来插入 \(0 \rightarrow x\)。注意这种链是可以自己成环的,于是要先枚举有多少个用来自己成环,然后把剩下的东西插进已经有的环里,每多插进一个之后的可以插到后面的位置就会多一个,因此这里是上升幂。由于这里两边基本是独立的,因此可以直接算出这里用这么多这种链多搞出 \(i\) 个环的方案数,然后只需要和前面卷起来就好了。剩下的 \(x \rightarrow 0\)\(0 \rightarrow 0\) 都可以类似分析,除了最后一种不能自己成环之外都没啥区别。

  • 需要尽量尝试让问题(限制等)更清晰。

T4

票价系统

\(a_i = [c_i < c_{fa_i}]\),则限制容易用带权并查集刻画为各个 \(i\) 之间的 \(f\) 的关系。之后二分答案 chk 的时候只需要 \(f_i\) 表示 \(a_i = 1\) 时自己的最小值,以及 \(g_i\) 反过来时的最大值。由于这两个对称,只记一个就可以了。剩下的转移只需要讨论儿子和自己的父边是否在同一连通块,合并它们的限制就可以求出自己的 \(f\)。构造方案也是容易的。

10.30

T1

知知穿夹克

显然每天只需要保留三件。然后从只有一件的开始拓扑排序即可。

  • 每天只保留三件。

T2

点分治

考虑直接做,观察一个子树中的点分树。发现 \(x\) 子树的点分树应当是原树点分树的一个虚树,而且原树上只有 \(x\) 到根的链上会有非这棵虚树上的点。也就是说我们只关注 \(x\) 在它子树点分树中的深度。而每次合并 \(x\) 的两棵子树的点分树的时候,只需要把两条到根链任意插起来就可以。当然 \(x\) 自己后面的东西的顺序是不重要的,因此还要枚举新的子树的到根链有多少要放在 \(x\) 后面。暴力是三次方的,后缀和优化一下就平方了。

  • 直接考虑子树中的子问题。

T3

高尔夫球赛

无论如何观察到只需要观察到只需要对每个洞左上角 \(3 \times 3\) 矩形暴力 dp 即可。

  • 也许可以打表注意到。
posted @ 2025-10-12 11:52  forgotmyhandle  阅读(15)  评论(0)    收藏  举报