新东方、ZR 历次模拟赛、杂赛部分题解

声明:本文可能不会按照时间顺序,而是笔者补题顺序。
题目不一定按照顺序。

ZROI CSP-S Day 5

T1、T2 太简单,不讲。

T3

首先我们维护一下甲的分值和乙的分值的差。也就是令 \(d = 甲的分数 - 乙的分数\)。如果 \(a_i = 1\),那么 \(d\) 一定会 \(-1\)。如果 \(a_i = 0\),我们会发现 \(d \le 2\),因为否则的话上一步一定会让分。此时如果 \(d = 2\),那么 \(d = d - 1\),否则正常 \(d = d + 1\) 即可。
接下来我们考虑对于每一个 \(r\),我们枚举所有的区间 \([l, r]\),只要符合这个区间的 \(d < 0\) 即可。我们设 \(f_d\) 表示差值为 \(d\) 总共有多少区间符合。但是如果我们直接这么判断的话,复杂度是 \(O(n ^ 2)\)。我们考虑记录偏移量 \(\Delta\) 表示一共有多少次向左或者向右的偏移。然后我们令 \(i = d + b - \Delta\)。此时 \(f_i\) 记录的就不是原来的量,而是现在的偏移量。为了保证 \(i \ge 0\),我们设 \(b = n + 3\)。
每次如果我们碰到了 \(1\),很明显 \(\Delta\) 就要减掉 \(1\);否则我们碰到了 \(0\),我们考虑对于所有 \(d = 2\) 的区间合并即可。

T4

首先,我们阅读到题面发现这个图很特殊,是一个仙人掌图,很自然地我们想到建立圆方树。
建立完圆方树后,我们以 \(1\) 号点为根,遍历整个圆方树。此时,我们记录 \(LCA\) 为 \(2\) 和 \(3\) 在树上的最近公共祖先,我们开始大分类讨论。
首先我们肯定发现一个性质,这棵树至多会断掉了 \(2\) 组边。这个结论非常显然。
如果断掉一组边的话,会有很多种可能:断掉 \(LCA - 3\) 的路径上的桥,断掉 \(LCA - 3\) 路径上的环,注意必须是把环的两边分别给断开,这样才能保证无法从 \(LCA\) 走到 \(3\);
如果断掉两组边,那么我们还是沿着上面的思路来看。
不论是第一种还是第二种,从 \(2\) 到 \(1\) 上面的桥一定不能断开,同时对于每一个环,我们只能沿着一边断开,另外一边不能断开。这是非常显然的。那么,此时我们的选择就很多样了,我们既可以选择在 \(3\) 到 \(LCA\) 的路径上断开环,也可以选择断开桥。这样我们稍微判断、分类讨论一下即可。
还有一种可能,就是说 \(LCA\) 如果是一个方点(环),那么我们草率地画出图看一下。我们设 \(1\) 走到 \(s\) 位置,\(2\) 走到 \(t\) 位置,\(3\) 走到 \(r\) 位置。这三个点在 \(LCA\) 这个环上的。此时我们发现,我们 \(s\) 到 \(t\) 的路径一定不能断,同时 \(t\) 到 \(r\)、\(r\) 到 \(s\) 的路径必须断开。然后我们再一次进行分类讨论即可。
代码过长,这里就不给出,详见这里。

ZROI CSP-S Day 4

T1 太简单,不讲。

T2

哎呀这个题我在场上思考半天只考虑 \(1\) 的位置,其实应该考虑 \(2\) 的位置。
首先我们考虑在什么情况下这个答案最优。我们打表可知,这个一定是在所有的 \(2\) 全部两两相邻最优。这是显然的。同时,我们注意到如果存在奇数个 \(2\),我们必须把最后一个 \(2\) 放到 \(r\) 的位置即可。
接下来我们维护一下 \(tmp\),表示把 \(i\) 和 \(i - 1\) 个 \(2\) 放在一起的答案,以此类推,然后我们把这个问题转化成一个区间 RMQ 问题即可。复杂度 \(O(n \log n)\) 。

T4

很神的一道计数题。
还是先发掘一下性质。我们注意到,这个把区间 \([l, r]\) 的和设为 \(sum\),那么此时最小化的答案是 \(\min (sum \bmod m, m - sum\bmod m)\)。我们设前缀和数组 \(pre_i\),令 \(pre_i = \sum_{1 \le j \le i} a_j \bmod m\),那么现在的答案可以写成 \(\min_{1 \le l \le r \le n} (pre_r - pre_{l - 1}) \bmod m\)。
此时我们考虑,相当于现在我们从 \(0\) 出发,一次一次向后跳,直到我们再一次跳回来。所以,我们把这些点映射到一个环上,从 \(0\) 一直排到 \(n\)。此时我们记录映射以后的点的间隔为 \(x_0, x_1, ..., x_n\)。此时必会有 \(\sum x_i = m\)。假设我们现在的答案是 \(d\),那么必定会有 \(d \ge z\)。然后我们差分一下即可。现在我们考虑任意两点之间间隔至少为 \(z\),令 \(y_i = x_i - z \ge 0\)。那么 \(\sum y_i = m - (n + 1) \times z\)。现在这个问题转化成我们要如何分配剩下的这些点。相当于我们要把若干个相同的小球放入若干个相同的盒子。答案根据插板法可以计算得到,其实也就是 \(\binom{m - (n + 1) \times z + n}{n}\)。此时我们的 \(x\) 根据 \(pre\) 映射来的,所以我们还需要乘上 \(n!\)(序列方案数)。
我们注意到 \(z \le \frac{m}{n + 1}\),所以我们只需要调和级数级别的复杂度计算即可。
最后的答案是 \(ans_n = n! \times \sum_{1 \le z \le \frac{m}{n + 1}} (z^k - (z - 1) ^ k) \times \binom{m - (n + 1) \times z + n}{n}\)。

T3

一道很好的性质观察题。
首先我们考虑修改位置 \(i\),由于我们知道每次 gcd 都会至少除以 \(2\),所以对于 \(i\) 来说前后都是有贡献的东西不超过 \(O(\log m)\) 个。
我们设 \(f\) 和 \(g\) 分别维护从 \(i\) 开始向前或者向后的位置以及他们的 gcd,令 \(F\) 和 \(G\) 分别表示以 \(i\) 为开头或者结尾的答案。我们每次更新 \(f\) 和 \(g\) 的复杂度都是 \(O(\log m)\) 级别的。
然后我们发现 gcd 具有单调不升的性质,于是我们枚举 \(i\),首先有可能是我们只用一边来,也就是向左或者向右延伸到最远。接着我们不妨遍历一下 \(f\) 数组,同时维护一个 \(g\) 的双指针,\(g\) 的双指针从后向前扫,因为 \(f\) 里面的数值如果越大,\(g\) 中的数值越小才有可能能配上对,正确性、复杂度显然。
然后我们枚举一下就做完了,复杂度 \(O(n \log m)\)。

CSP-S 2020

T1、T2 太简单,不讲。

T3

一眼看上去像个线段树,实际上是 DP + toposort。
很明显我们可以把一个点最终的答案视为 \(a_i \times k + b_i\),也就是一个点整体被翻了 \(k\) 倍,之后又加上了一个 \(b_i\) 表示单点修改。根据我们做线段树 2 的经验,我们很明显会发现这个 \(b_i\) 的计算其实可以依赖前面的线段树操作得到的。这是显然的。
所以我们对于一个点(函数)维护两个值:\(f_u\) 和 \(mul_u\) 分别表示这个点被操作的次数(也就是需要乘上的系数)以及这个点的乘法效果。我们可以知道,对于每一个 3 类型函数的 \(mul_u\) 就是它的所有连点的乘积,它的所有连边的 \(f_v = f_u\),并且 \(f_u = f_u \times mul_v\)。
然后我们首先计算出每一个 \(mul_u\) 即可,然后再 toposort 一下即可。

T4

我们观察到一个性质:如果当前最强的蛇吃掉最弱的蛇不会变成最弱的,它一定会吃;这是显然的。
其次,哪怕我们成为最弱的蛇,如果我们下一个吃掉依旧是最弱的蛇,它也不会吃;一次类推。我们发现,对于第二种情况,如果循环长度是偶数,那么我们这只蛇就可以放心大胆地吃掉最弱的蛇,因为这样肯定不劣。同时,这条蛇吃掉之后游戏结束。
所以我们根据上面的过程使用 set 模拟即可。复杂度 \(O(Tn \log n)\),可以得到 \(70\) 分。
使用 set 之所以不能通过,是因为 set 会带有一只 \(\log\),考虑使用常数级别复杂度优化。考虑使用 deque。我们维护两个 deque,分别表示当前没有被吃掉的蛇的顺序以及吃过了之后的蛇的顺序。这两个都是具有单调性的,因为 \(x_1 > x_2\) ,\(y_1 < y_2\),所以一定有 \(x_1 - y_1 > x_2 - y_2\)。考虑单调性之后我们每次从两个双端队列的队尾取出即可。这样的复杂度可以做到 \(O(Tn)\),足以通过本题。

ZROI CSP-S Day 3

T1、T2 太简单,不讲。

T4

首先考虑博弈过程。这里有一个反直觉的东西,Alice 一定会向上封,再向下封。其实仔细一想也挺好理解的,因为如果向下封,Bob 随便有一个机会就可以跳出去,相当于前功尽弃。所以 Alice 一定不会这么选择,只要把从自己出发的位置到 \(1\) 节点上面的路径统计一下。
我们此时假设向上封 \(x\) 步,向下堵了 \(y\) 步。作为聪明绝顶的 Bob 一定会选择当前这一步最好的结果:向上跳,向下走,或者等待向上跳。因为我们枚举了 \(y\),所以我们直接考虑这三种中的最大值一定是 Bob 的最优选择。
我们考虑 DP,设 \(f_i\) 为我们在主链上面的第 \(i\) 个位置的最优答案。因为我们已经考虑走到 \(top\) 这个位置,分类讨论这个点是否已经被控制住了,可以从 \(f_{top + 2} - top\) 转移过来即可。
然后另外的几种方法也是分类讨论即可。复杂度 \(O(n)\),码量超级大。

T3

我们通过观察,发现了一个性质:
假设我们现在一共有 \(i\) 种颜色,并且长度为 \(2\) 的块一共存在 \(k\) 个,那么我们知道 \(n = 2 \times k + i - k\),所以就是 \(k = n - i\) !
也就是说,长度为 \(2\) 的块的数量直接和 \(i\) 挂钩。
考虑计数 DP。我们设 \(f_{i, j}\) 表示现在我们有 \(i\) 种颜色,铺满了长度为 \(j\) 的木板。首先,我们考虑直接在一个位置后面添加,此时的方案数是 \(2j - 3i\);如果我们替换掉一个,那么我们共有 \(2 \times (j - i)\) 种选择方式。所以我们得出状态转移方程:
\(f_{i, j} = 2 \times(j - i) \times f_{i - 1, j - 1} + (2 \times j - 3 \times i) \times f_{i - 1, j - 2}\)。
最后的答案就是 \(\sum \binom{n - 1}{i - 1} \times f_{i, n}\)。按照这个计算即可。

CSP-S 2022

T3

不可以,总司令。
好的其实下午一看就会了。
首先我们把题目翻译成人话,也就是说我们每次可以选择断掉或者加上 \((u, v)\),或者删掉、加上所有以 \(u\) 为结束的边。现在要求我们判断每个点是不是都在一个环上,并且要求每个点的出度都是 \(1\)。
首先啊我们知道第一个条件什么用也没要,因为出度是 \(1\) 的有向图一定构成环。所以我们等价于判定出度都是 \(1\)。我们随机给每一个点附一个权值 \(val_u\),令 \(g_v = \sum_{(u, v) \in E} val_u\),同时我们保存一个 \(f_v\) 不进行更改。设 \(tot = \sum val_i\),然后对于每一个操作我们加上或者减掉对应的权值即可。
总结:题目很简单,上午傻了没想到。

T4

首先我们发现 \(k = 1\) 和 \(k = 2\) 其实是简单的,只需要树上前缀和维护一下,后者把 \(x\) 到 \(y\) 上面的路径找出来然后 DP 一下即可。
考虑 \(k = 3\)。我们观察到一个性质,就是我们只可能调到路径上任意一个点的儿子上面。正确性显然。我们考虑设计状态:设 \(f_{i, 0 / 1}\) 表示第 \(i\) 个节点,它代表的是他自己或者它的儿子的最优答案。状态转移方程显然。
但是我们这个做不动啊,必须得考虑优化。引入一个东西叫做动态 DP,说白了就是使用矩阵从下向上倍增得到答案。因为这个转移的格式类似于矩阵,考虑使用矩阵优化。
所以我们记录一下,对于任意一个位置 \(u\) 向上走 \(2^i\) 步,或者记录从 \(2^i\) 级祖先往回走的答案,最后统计输出即可。

总结:没见过很难想到,但是想到了就不难。

CF2133F

A ~ E 是简单题,不讲。

F

我们考虑 DP。我们设 \(f_i\) 表示强制炸掉第 \(i\) 个,此时我们已经把 \([1, r_i]\) 的所有的东西全部清除掉的最小爆炸次数。先考虑一个 \(O(n^2)\) 的转移。
我们枚举一个 \(j\),这样的话必须得满足一下两个条件之一:

  • \(j < l_i\),也就是 \(j\) 不会被炸到;
  • \(i > r_j\),也就是保证 \(i\) 不会被 \(j\) 炸到。
    以上两个东西我们可以使用线段树分别进行维护。

考虑如何输出。首先我们记录 \(lst_i\) 表示 \(f_i\) 这个位置我们最优情况是从哪里转移过来的。所以我们每次记录最优值之后倒序查找即可。把这个序列找到然后再拓扑一下即可。其实不是很难想,但是很难写。

ZROI CSP-S Day 6

T1、T2 是 ZROI CSP-J 七连测的题。

T3

我们设 \(f_i\) (字符串)表示答案为 \(i\) 时候的最优字符。我们设 $f_1 = $ (),$f_2 = $ [],$f_3 = $ {}。
首先,我们根据题意任意一个字符串肯定可以由两个字符串拼接在一起。所以我们枚举 \(f_i = f_j + f_{i - j}\)。
如果 \(i\) 是 \(a\) 的倍数,那么一定 \(f_{i} = ( + f_{\frac{i}{a}} + )\)。以此类推,所以我们可以提前预处理出来,然后查询的时候直接调用即可。
难度普及组。为啥没做出来?傻了......

T4

首先我们考虑一下如果 \(x_i\) 都是 \(-1\) 的情况。这样的话我们既然没有要求那我们就放飞自我随便填,答案是 \((r + 1) ^ k\)。
我们首先可以把联通块搜出来,假设一共有 \(tot\) 个联通块。我们设 \(f_{i, S}\) 表示对于第 \(i\) 层,我们现在联通块使用状态是 \(S\) 的方案数。首先我们需要求一下 \(w_S\),表示这一层有多少个联通块是使用状态的,接下来如果 \(w_S = x_i\),也就是说现在的联通块状态符合题意,我们就考虑令 \(f_{i, S}\) 加上 \(f_{i - 1, S'}\)。这么做正确性显然,但是复杂度爆炸。
我们考虑一种叫做 SOS DP 的东西,也就是我们设 \(g_S\) 表示所有合法的答案的和。这样我们没必要一个一个 check \(S'\) 是否合法,只要合法一并加上即可。
复杂度 \(O(r \times tot \times 2^{tot})\)。

CSP-S 2024

T1、T2、T3 太简单,不讲。

T4

首先我们需要读懂题。
考虑如何分析。我们注意到一下三条性质:

  • 自由选手对正式选手没有影响,也就是说自有选手可以随机选择的权值对正式无影响;
  • 正式选手一定已知胜负(感觉是废话);
  • 一旦正式选手输掉了现在的比赛,以后没有机会胜利。

所以我们考虑设 \(w_u\) 表示 \(u\) 这个节点的答案。我们不妨令 \(tag1_u\) 表示 \(u\) 节点是否是关键点,如果是 \(1\) 表示是,\(2\) 表示“躺赢”,\(-1\) 表示已经输掉了比赛,\(0\) 便是没有影响;设 \(tag2_u\) 表示这个点在输入的字符串中谁是擂主,\(1\) 表示左儿子是擂主,\(2\) 表示右儿子是擂主;\(minn_u\) 表示 \(u\) 这个节点一直往上走(作为擂主)至少需要的能力值。

接下来我们贪心考虑,从 \(2\) 逐个向后添加子节点。最核心的部分:
我们假设现在是左儿子是擂主,如果现在它输了,那么父亲直接继承了右儿子的贡献,同时答案减掉左儿子的贡献;如果它赢了,那么父亲直接继承它的贡献;同时封锁右子树。
以上过程是显然的,考虑如何分析复杂度:我们注意到每一个点只会进行常数次 \(tag\) 的变化,且变化之后不会改变,所以复杂度其实就是 \(O(n)\) 的。

ZROI CSP-S Day 7

T1 按照题意模拟即可。
T2 按照 \(p\) 的模数,然后从左到右 \(O(n)\) 贪心即可。

T3

首先我们可以观察到一个性质:答案是确定的。也就是说,我们的折叠顺序并不会影响我们的答案。
所以,我们考虑使用一些数据结构维护这个过程。首先我们观察到什么情况之下会合并两个节点,根据题意我们知道 \(a_u = a_v\) 并且边权一致的情况下可以进行合并。所以我们可以使用 map 进行合并。这样我们直接就启发式合并即可。启发式合并的复杂度是 \(O(\log n)\)。所以我们每次遍历一条边然后 check 一下即可,复杂度大概是 \(O(n \log^2 n)\) 的。

T4

首先我们观察到一个性质,对于点 \(u\) 有且仅有一个点可以不选择。很简单,如果 \(v1\) 和 \(v2\) 同时不选择,那么在第一秒的球都会从 \(v1\) 和 \(v2\) 滚动到了 \(u\),这明显不对。
根结点固定为收纳结点。方案合法,当且仅当:对每个结点 \(u\),其儿子中至多一个不是收纳结点。

设 \(p_v\) 为结点 \(v\) 是收纳结点的概率,\(\mathrm{ch}(u)\) 为 \(u\) 的儿子集合。定义

\[q_u= \prod_{c\in \mathrm{ch}(u)}p_c + \sum_{c\in \mathrm{ch}(u)} (1-p_c)\prod_{\substack{c'\in \mathrm{ch}(u)\\c'\ne c}}p_{c'}, \qquad q_u=1\ \text{若}\ \mathrm{ch}(u)=\varnothing . \]

整体合法概率为

\[Q=\prod_u q_u. \]

若某个 \(q_u=0\),答案为 \(0\)。

对边 \((w,\mathrm{par}(w))\),定义

\[\mathrm{num}_w=(1-p_w)\prod_{\substack{c\in \mathrm{ch}(\mathrm{par}(w))\\c\ne w}}p_c, \qquad \alpha_w=\frac{\mathrm{num}_w}{q_{\mathrm{par}(w)}}. \]

若 \(P(x,y)\) 表示路径 \(x\to y\) 上的结点集合,则

\[\Pr\bigl[(x,y)\text{成立且方案合法}\bigr] = Q\prod_{w\in P(x,y)}\alpha_w. \]

记 \(d_x\) 为球 \(x\) 的滚动距离。对 \(0\le j<k\) 定义

\[H_x^{(j)} = \sum_{y} m^j\prod_{w\in P(x,y)}\alpha_w, \qquad m=\mathrm{dep}(x)-\mathrm{dep}(y)+1, \]

其中 \(y\) 取 \(x\) 的祖先或 \(x\) 自身,且 \(y\ne 1\)。边界

\[H_1^{(j)}=0. \]

递推为

\[H_x^{(j)} = \alpha_x\left( 1+\sum_{i=0}^{j}\binom{j}{i}H_{\mathrm{par}(x)}^{(i)} \right), \qquad 0\le j<k. \]

最终答案为

\[Q\sum_{x\ne 1}\sum_{j=0}^{k-1} (-1)^{k-j+1}\binom{k}{j}H_x^{(j)}. \]

计算 \(q_u,\alpha_u\) 的总复杂度为 \(O(n)\);递推 \(H\) 的复杂度为 \(O(nk)\),空间复杂度为 \(O(nk)\)。按父先于子的顺序递推即可。

ZROI NOIP Day 2

T3

首先我们注意到什么样的格式是合法的。
我们把所选择的点放在数轴上,发现这些点之间构成的空区间,当且仅当 \([L_i, R_i]\) 所对应的区间范围内没有点,我们就可以把这个区间放在这里。
我们设 \(f_{l, r}\) 表示在区间上 \([l, r]\) 之间的,也就是所有都在 \([l, r]\) 区间内部的点的答案。我们枚举 \(i\),使得 \(i\) 成为第一个放入这里面的点。很明显,这些点是等概率选择的,假设区间内部数量是 \(c\),那么 \(f_{l, r} = 1 + \frac{1}{c} \sum f_{l, a_i - 1} + f_{a_i + 1, r}\)。
考虑优化,我们设 \(A_{l, r} = \sum f_{l, a_i - 1}\),\(B_{l, r} = f_{a_i + 1, r}\),那么 \(A_i\) 按照 \(r\) 的顺序单调递增,而 \(B_i\) 按照 \(l\) 的顺序单调递减。所以我们依次枚举 \(r\) 和 \(l\),然后我们从左往右扫一下就可以。复杂度 \(O(n ^ 2)\)。

posted @ 2026-10-11 08:01  Bob1108  阅读(12)  评论(0)    收藏  举报