模拟赛训练记录

3.9

A

题意:$q$ 次对 $n \times n$ 的二维矩阵中一个子矩阵添加 $k$ 个颜色为 $c$ 的点,最后查询矩阵每个位置所有颜色的绝对众数,没有则为 $-1$。

做法1:考虑使用摩尔投票找出绝对众数,再check是否合法,暴力可以使用树套树暴力修改,时间复杂度 $O(q\log^2{n})$,将树套树改为对一维猫树分治,时间复杂度降为 $O((q+n^2)\log{n})$,check本质是对每个颜色二维数点,可以做到 $O((n^2+q)\log{n})$。

做法2:考虑按二进制分组,第 $i$ 组为颜色编号的第 $i$ 位二进制为 $1$ 的所有修改,于是可以根据每一组当前位置的数量是否大于全局修改下当前位置的数量的一半,唯一确定绝对众数,再check是否是真的绝对众数,check同做法1,时间复杂度 $O((n^2+q)\log{qn})$。

B

咕咕咕

C

题意:均匀随机生成一张 $m$ 条边的连通图,并确定其加边顺序,每次加边后割边数量变化为 增加/不变/减少 的代价分别是 $A$/$B$/$C$,求代价和的期望。

记 $f_{i, j}, g_{i, j}, h_{i, j}$ 分别表示当前点数为 $i$,连通块状态是 边双/边双构成的链/边双构成的树 的加边总方案数。

记 $F_{i, j}, G_{i, j}, H_{i, j}$ 分别表示当前点数为 $i$,连通块状态是 边双/边双构成的链/边双构成的树 且其中某一次加边的贡献已经被计算的加边方案贡献和。

注意到 $f, F, g, G$ 可以互相转移,背包即可 $O(n^2m^2)$ 求解,而 $h, H$ 本质是若干边双连成树,设分成边双个数为 $k$,其大小分别为 $a_1, a_2, \cdots, a_n$,则其连成树的方案为 $\prod_{i = 1}^k a_i n^{k - 2}$,其中 $n$ 是总点数,所以也可以背包,总时间复杂度 $O(n^2m^2)$,注意到所有背包都是二维背包,将其中 $j$ 这一维写成指数型生成函数可以利用插值优化至 $O(nm(n+m))$。

 

3.16

A

题意:有两个数 $x, y$,初始给定 $x$ 且 $y=0$,共 $n$ 种操作方式,第 $i$ 种你可以花费 $a_i$ 的代价给 $y$ 加上 $b_i$,你的最终代价是操作总代价加上 $\frac{x}{y}$,求最小最终代价并以分数形式输出,$q$ 次询问,每次给出 $x$。

首先取出性价比最高的操作 $x$,那么记 $f_i$ 表示 $y=i$ 时的最小代价,显然有对于 $i > nV$ 有 $f_i = f_{i - b_x} + a_x$。

不妨考虑按 $i \bmod b_x$ 分等价类,那么对于查询的 $x$ 从小到大扫时,显然每个等价类内部的最优答案下标也是递增的,于是可以计算出等价类内部更换最优下标的分界点,然后离线询问扫描线即可。

时间复杂度 $O(qn+n^2\log{n}+n^3)$。

B

抽象构造,咕咕咕。

C

题意:有一个无限长的序列,下标从 $1$ 开始,初始为 $1, 2, 3, \cdots$,每次操作会同时删去这个序列中下标为 $a_1, a_2, \cdots, a_n$ 的元素,$q$ 次询问,每次给出 $k, x$,求对初始序列执行 $k$ 次操作后序列中的第 $x$ 个元素。

考虑把询问离线,然后暴力维护每一个询问的跳的过程。

具体地,考虑扫描线并维护一棵平衡树,对于每个 $i$ 维护询问跳到 $[a_i - i + 1, a_i - 1]$ 之间的询问,从 $i$ 变到 $i+1$ 的时候把跳的过程中就结束的询问暴力找出来算掉,其余的位置的更改都可以打 tag,然后移动的最后会有一些细节,但可以通过 split 和 merge 轻松实现。

总时间复杂度 $O((n+q)\log{q})$。

 

3.17

A

题意:给定一棵树,$1$ 是根,点有点权(可能为负),定义一个选取方案为选取一个包含根的连通块或者空连通块,被包含的点权和为其权值,定义一棵树的权值为一个二元组 $(val, siz)$,其中 $val$ 表示权值最大的选取方案的权值,$siz$ 表示所有权值最大的选取方案中连通块最大的方案的连通块大小,$q$ 次操作,每次要么单点加正权,要么查询一个点的权值至少要多少才能使当前树的权值二元组产生更改。

考虑一个贪心:初始所有点都是独立的,每次选取一个权值最大的连通块,如果点权非负则与其父亲合并,并将合并的连通块的权值记为包含的点权和,否则结束,此时与根联通的块即为最优块。

由于修改是加正权,所以修改之后并不会导致之前已合并的连通块分裂,只会产生新的合并。

考虑使用并查集维护每个连通块,那么修改即增加当前所在连通块的和,如果和非负则与当前连通块根的父亲所在连通块合并。

然后考虑查询怎么做。发现答案即到根路径所有连通块(不包含根所在连通块)的权值和的相反数(如果根所在块权值为负则也需加入根所在块权值)并与 $1$ 取 $\max$。

于是只需单点修改直链查询,树状数组即可,时间复杂度 $O((n+q) \log{n})$。

B

题意:定义一个对 $01$ 串的变换 $f(S)$ 为:对于 $S$ 的每个 $0$ 将其替换为 $001$,每个 $1$ 替换为 $01$,给出一个位置序列,要求构造两个长度不超过 $3 \times 10^5$ 且 $01$ 个数相同的串 $S, T$,使两个串分别变换 $22$ 次之后不同的位置恰好为给定序列,读入序列长度 $\le 3 \times 10^5$,保证有解。

首先考虑转化。

我们考虑 $S$ 的每一段前缀($T$ 同理),若其中有 $x$ 个 $0$ 和 $y$ 个 $1$,则令 $(x, y)$ 表示这一段前缀,并将所有点按前缀顺序连成折线。

那么可以得到某个 $0$ 对应的是 $(x, y)$ -> $(x + 1, y)$ 的线段,$1$ 对应的是 $(x, y)$ -> $(x, y + 1)$ 的线段。

考虑一次变换带来的影响,发现对于原来存在的整点 $(x, y)$,其变化为 $(x, y)$ -> $(2x + y, x + y)$。

不妨先令整个平面进行 $(x, y)$ -> $(2x + y, x + y)$ 这个变换,显然其为线性变换。

则 $(x, y)$ -> $(x + 1, y)$ 会变为 $(2x, y)$ -> $(2x + 2, y + 1)$,$(x, y)$ -> $(x, y + 1)$ 会变为 $(2x, y)$ -> $(2x + 1, y + 1)$。

然后再将其改为 $f(S)$ 对应的折线形式,则有:$(x, y)$ -> $(x + 2, y + 1)$ 的斜线会被更改为 $(x, y)$ -> $(x + 1, y)$ -> $(x + 2, y)$ -> $(x + 2, y + 1)$ 的三段线段,$(x, y)$ -> $(x + 1, y + 1)$ 的斜线会被更改为 $(x, y)$ -> $(x + 1, y)$ -> $(x + 1, y + 1)$ 的两段线段。

引理 $1$:变换前后,由 $S$ 与 $T$ 对应折线包住的面积不变。

证明:首先进行线性变换前后面积不变是显然的。然后考虑由斜线改为折线的过程。发现每一块由 $S$ 与 $T$ 包住的面积,其上下边界的对应斜线每种种类(即 $(x, y)$ -> $(x + 1, y + 1)$ 还是 $(x, y)$ -> $(x + 2, y + 1)$)数量是相同的,则上边界“缩进去”的面积与下边界“凸出来”的面积是相同的,所以证毕。

引理 $2$:考虑每个被折线包住的方格(即顶点为整点且面积为 $1$ 的正方形),令其左上角坐标为 $(x, y)$,则该方格变换后有对应方格,且对应方格左上角坐标为 $(2x + y, x + y)$。

证明:首先考虑进行线性变换后的图形中与变化前的 $(x, y)$ 的对应关系。由于变成折线后需要 $(2x + y, x + y)$ 作为某个被包在折线中的方格的左上角,简单观察后可得 $(2x + y, x + y)$ 需满足其为被包在变换后图形中的一个整点且不位于下边界上。于是我们只需证明存在一对原图形折线上的点(不要求是整点) $(a, b)$ 与 $(c, d)$ 满足 $a + b = x + y = c + d$ 且 $2a + b \le 2x + y < 2c + d$,即我需要在原图形中某条 $x + y = k$ 的直线上,找到满足 $a \le x < c$ 的一对符合条件的点。由于 $(x, y)$ 在原图形中是某个被包在折线中的方格的左上角,则其不可能位于下边界,且由于其被折线包含,则显然可以找到这样一对合法点,于是引理成立。

由引理 $1$ 和引理 $2$,有变换前后的每个被包在折线中的方格是一一对应的,且左上角坐标对应关系为 $(x, y)$ -> $(2x + y, x + y)$,于是可以得到原始图像每个点 $(x, y)$ 变换 $22$ 次之后的坐标,记为 $(ax + by, cx + dy)$。

由于系数很大,所以显然有变换 $22$ 次之后的图像中每个方格都是独立的面积,则每个方格对应了读入的位置序列中的 $k, k+1$ 两个值,且有 $(a + c)x + (b + d)y = k$,于是解该不定方程,显然有该方程在 $0 \le x \le 3 \times 10^5$ 范围内只有一组解,直接解可以得到原始图像中被折线包含的所有面积,直接构造一组合法解即可,时间复杂度 $O(n \log{V} + m)$,其中 $m = 3 \times 10^5$。

C

题意:对于一个长为 $n$ 的 $01$ 序列 $a$($n$ 为奇数),你可以对其进行操作直至只剩三个元素:每次选择一个非序列端点的下标 $x$ 满足 $a_x = 1$,删去其左右两个元素并将剩余序列相接。一个序列是好的当且仅当存在一种操作方案使操作完后 $a_2 = 1$。给定 $a$,但其中有若干位置是未知的,$q$ 次操作,要么单点修改 $a$ 中元素,要么查询有多少种将未知位置确定的方案使得确定后序列是好的并对 $10^9 + 7$ 取模。

考虑怎么判定一个序列是不是好的。

首先给出结论:去除头尾两个元素后,若序列中存在长度 $> \frac{n - 1}{2}$(其中 $n$ 为删去头尾后的序列长度)的连续 $0$ 段,则该序列是不好的,否则是好的。

充要性易证。

于是就好做了,我们直接对存在长度 $> \frac{n - 1}{2}$ 的连续 $0$ 段的序列计数,具体算法则是钦定某一段为长为 $\frac{n + 1}{2}$ 连续 $0$ 段的方案数 - 钦定某一段为长为 $\frac{n + 3}{2}$ 连续 $0$ 段的方案数,至于修改使用线段树维护即可,只需维护一个二元组,支持对二元组第一个元素区间乘,对二元组第二个元素区间加,查询全局第二个元素最小的位置的第一个元素的和,时间复杂度 $O(q \log{n})$。

posted @ 2025-03-10 13:45  ORzyzRO  阅读(15)  评论(0)    收藏  举报