2024.4 做题纪要

aaaaaaaaaaaaaaaaa

大致是在成七集训,虽然挺多都是 3 月底的不过还是整一下。

2024.3.30

T2 简单题

给定正整数 \(n\),定义集合 \(S = \{1, 2, \cdots, 2n\}\),求一个大小为 \(n\) 的子集,满足两两不存在倍数关系且和最小,输出最小的和。

\(n \le 5 \times 10^5\)

我感觉这种题应该见过不少次了,不过见到还是不会做,流汗。

但是这题好像各种贪心都能过,流汗。

考虑将数写成 \(k 2^d\) 的形式,注意到如果有两个数的 \(k\) 相同,那么它们必定存在整除关系,所以 \(k\) 一定互不相同。而 \(k\) 一定是奇数,于是这 \(n\) 个数的 \(k\) 就一定是 \(1, 3, \cdots, 2n - 1\) 的一个排列。那么我们相当于考虑最小化 \(d\) 了。记这些 \(d\)\(d_k\)。注意到对于任意一个数 \(p\) 来说,如果 \(d_{k} \le d_{pk}\) 的话,那么这两个数就一定存在整除关系了,所以必须满足 \(d_{k} > d_{pk}\)。发现 \(d_k\) 应当是一个单调不增的东西,可以直接倒着用最紧的限制 \(d_{k} > d_{3k}\) 找到每个 \(d_k\) 的最小值,容易发现这组 \(d_k\) 是合法的,于是就得到答案了。

2024.4.1

T3 木棍

\(n\) 根长度相同的木棍,长度均为 \(k\),每个木棍要放置在 \([l_i, r_i]\) 的区间内,要求木棍两两不能重叠。此外还有 \(m\) 条额外限制,要求 \([x_i, y_i]\) 区间内的木棍最多有 \(c_i\) 根。

\(n, m \le 1000\)\(l_i, r_i \le 10^9\)

首先显然可以把线段转化成点,满足每两个点之间距离至少为 \(k\)

\(b_i\) 为第 \(i\) 个位置是否有木棍的 01 序列,那么这些限制都可以写成若干个区间和小于等于 \(c_i\) 的限制,而合法的 \(b_i\) 一定满足存在匹配,可以 Hall 定理转化成每个区间和大于等于区间内完全包含的待放区间数。而还有相邻两个数之间距离至少为 \(k\) 的限制,这可以看作是每个长度为 \(k\) 的区间和 \(\le 1\),加上每个长度为 \(1\) 的区间也 \(\le 1\),这样我们的所有限制就都转化成了每个区间和的限制。

考虑如何限制区间和,前缀和一下,发现限制就变成了若干 \(p_r - p_{l-1} \ge c\)\(p_r - p_{l-1} \le c\) 的形式,容易想到差分约束。我们建一排点,分别表示前缀和后的 \(p\),然后此时我们有若干向前和向后连的边。我们把边分为三类,第一类是 Hall 定理得出的限制,设 \(h(i, j)\) 表示 \([i, j]\) 内包含多少待放区间,那么对于所有 \(i < j\)\(j\)\(i\) 连边权为 \(-h(i, j)\) 的边。第二类边是由 \(k\) 得出的限制,对于任意 \(i<j\)\(i\)\(j\) 连边权为 \(\lceil\frac{j - i}{k}\rceil\) 的边,第三类边就是所有 \(x_i\)\(y_i\) 连边权为 \(c_i\) 的边。

首先要解决的问题是,现在点数是关于值域的,肯定没法直接跑。注意到我们只关心这张图存不存在负环,所以我们尽可能最小化环的长度。首先对于这两个贡献函数来说,都有 \(f(i, j) + f(j, k) > f(i, k)\),也就是说连续走两条第一类或第二类边是不优的。而 \(h(i, j)\) 只在离散化后的数组上的位置会发生变化,所以我们一定能调整第一类边的端点到离散化数组上的值,那么也就是说如果存在负环,那么一定存在只经过离散化后的数组上的点的负环,于是我们就可以放心的在离散化后的数组上做了。直接跑差分约束即可做到 \(O(n^3)\) 了。

考察正常 Bellman-Ford 算法,我们令 \(f_{ku}\) 表示经过 \(k\) 步后到 \(u\) 的最短路,如果 \(f_{n, u} = f_{n + 1, u}\) 则没有负环。那么我们考虑快速从 \(f_{k, *} \to f_{k+1, *}\)。首先第三类边是最容易处理的,暴力转移即可。第一类边的贡献函数是 \(h(i, j)\),就是 NOIP2023 T4 的做法直接扫描线即可。第二类边的贡献函数带上取整,不太好处理。发现我们可以用 \(\lfloor\frac jk\rfloor - \lfloor\frac ik\rfloor\) 来估计 \(\lceil\frac{j-i}{k}\rceil\),误差只与 \(i \bmod k, j \bmod k\) 有关,于是可以以 \(i \bmod k\) 为下标建线段树来做这个贡献。总之两种贡献都可以 \(O(n \log n)\) 优化转移。于是总复杂度为 \(O(n^2 \log n)\)

AGC059E Grid 3-coloring

我真的是抽象完了的做法。真的以后不瞎寄吧编做法了,做这题给我做吐了。

相邻两个位置不相等是一个很抽象的的条件,考虑转化一下,把颜色看作 \(\bmod 3\) 意义下的数,然后将第 \(i\) 个对角线加上 \(i\),这样上下或左右两个位置之间要不然颜色相同要不然正好减 \(1\)。这相当于要求从任意一个点向右下走只能减 \(1\) 或不变。画一下图,容易发现最后的矩形由若干条从左下到右上的路径划分开。

img

我们把右上边框和左下边框分成两部分,那么这个矩形就可以看作是左下边框到右上边框的若干条路径。注意此时左下与右上是若干连续段,我们考虑保留一段连续段中最靠中间的点,然后转化成这些点之间的路径,容易发现这两者是等价的。需要注意两个连续段内要求任意两点都是可以通过向右、上、右上走达的,所以如果两个段的左端点或者右端点之间不能互达那么就是无解的,需要先把这种情况判掉。

img

(关于等价的证明:对于左边框来说,由于靠上的段只能往上走,于是不会影响下面的段,所以我们只需要考虑这个连续段中最靠下的那个点能否到达右上角对应的段即可,显然通过这条路径划分的连通块内是包含整个连通块的。如果经过中点,我们考虑先把在中点往上的路径与中点往右的路径全部填好,此时只需要中间存在一条路径,就可以保证这个连续段内任意一个点都可以到达对面的点,所以只需要保留中点。)

那么现在问题转化成了,给定一个 \(n \times n\) 的网格图,有 \(k\) 个起点与终点,分别位于左下边框与右上边框,问是否存在 \(k\) 条点不相交的路径。

我们可以转化成流的问题,可以容易的建出流图:

img

其中斜着的一对点是由一个点拆点得到的,为了限制一个格子至多走一次。黑色边是起点与终点的边,这些边容量可能为 \(0\)\(1\),对应着这里有起点或没有起点。

我们的目的就是求出这张图的最大流。注意到这是一张平面图,我们考虑建其对偶图求最短路即可。

这里需要说明的一点是,我从网上找到的一些资料,全部都只提到了将边旋转后建出图,但是实际上在有向图的情况下,这样的图的最短路并不一定就是最小割,因为最小割并不一定在对偶图上形成连续的一条路径。所以我们还需要将对偶图所有边建一条反向的边权为 \(0\) 的边,此时对偶图的最短路才等于原图的最小割,即最大流。

建出对偶图:

img

其中绿色边地边权对应着这一块有没有起点,其它的橙色边边权均为 \(1\),且有反向 \(0\) 的边权。

观察对偶图可以发现,中间的点也可以看作是拆点,然后可以向右、下、右下走。注意到向下、右走都可以走一条反边加一条正边,而向右下走至少经过两条边,所以此时向右下的边是没有意义的,所以我们实际上只会向下或向右。那么我们枚举在边框上的起点和终点,那么我们就能知道最短路了。由于在边框上走一定比在中间走更优,所以我们在中间部分一定只会往右或只会往下走,那么这样我们就只有 \(O(n)\) 条路径需要判断了,直接判即可。最后判断最小割是不是等于 \(k\) 即可。

2024.4.2

T1 斩首 (Gym104901F)

考虑求出前缀答案 \(f_i\) 和后缀答案 \(g_i\),那么每个点的答案就是 \(\sum_{l=1}^i \sum_{r=i}^n f_{l-1} g_{r+1} [r-l+1 \ge \max_{k \in [l, r]} a_k]\)

考虑怎么算 \(f_i\),发现这玩意算不了一点,由于限制里有最大值,那么就考虑分治,\(\max(ml_l, mr_r) \le r - l + 1\) 可以拆成二维数点。

然后考虑怎么计算答案,同样可以分治,处理所有经过当前分治中心的 \([l, r]\)。假设 \(i\) 在左区间,那么考察 \(ml\) 发生什么变化,发现如果 \(i\) 在单调栈上就会将一个区间内的 \(ml\) 修改,否则不变。注意到每个 \(ml\) 只对应一个 \(i\),那么就可以直接暴力了。拿总答案再加上 \(ml\) 发生变化的一段的变化量即可。复杂度 \(O(n \log^2 n)\)

T3 战争

有一棵 \(n\) 个点的树,树有边权,初始全为 \(0\)。有 \(m\) 个时刻,每个时刻进行一次操作,操作有两种:

  • 1 x y \(x\)\(y\) 的链上加 \(1\)
  • 2 t 撤销第 \(t\) 时刻的操作(保证一定是第一种操作且没有被撤销过)。

现在有 \(q\) 次询问,每次询问 \([l, r]\) 时刻内,边权始终 \(\ge 1\) 的深度最大的边。定义边的深度为两个端点到根经过的边数的较大值。

\(n, m \le 10^5, q \le 5 \times 10^5\)

考虑一个部分分,\(x=1\),即所有链加操作都是根链。考虑找出每个操作的存留时刻的区间 \([l, r]\),那么对于某一条边来说,其存留时刻就是子树内所有区间的并。对于每一条边来说,得到的边数肯定还是 \(O(n)\) 的,所以我们不能直接找出每条边的所有区间。注意到我们只关心深度最深的边,那么我们只用考虑每个区间的最早的一次形成即可。我们直接树上启发式合并,每插入一个区间就会与原来的若干区间并成一个新区间,这样我们就能得到 \(O(n \log n)\) 个区间了,然后就是一个矩形 \(\max\) 单点查询了,时间复杂度 \(O(n \log^2 n + q \log n)\)

考虑 \(x \ne 1\) 的情况也是简单的,我们改成用线段树维护区间并,这样我们就可以进行撤销操作了。每次插入一个区间后,在线段树上二分找到所在的最长的区间,剩下的做法和 \(x=1\) 的相同了。

2024.4.5

T3 Text

给定一个长为 \(n\)、值域为 \(m\) 的字符串 \(s\),多组询问,求字典序小于等于 \(s\) 的长为 \(l\) Lyndon 串数。模数由输入给定。

\(n \le 10, m \le 1000, l \le 5 \times 10^6\)

这题好牛啊。

首先对于字符串 \(s\),考察其 Lyndon 分解,那么对于任意一个字典序小于等于串 \(s\) 的 Lyndon 串,其字典序一定小于等于 Lyndon 分解的第一个 Lyndon 串。于是我们可以只保留 \(s\) 的前缀最长 Lyndon 串。

然后对于任意一个字符串,考虑其与字符串 \(s'=sssssss\cdots\) 的大小关系,对任意一个字符串进行 Lyndon 分解后,第一个 Lyndon 串一定小于等于 \(s\),而 Lyndon 串分解不增,于是所有分解出的串都小于等于 \(s\)。反过来,所有串均小于等于 \(s\) 的串也小于 \(s'\)

那么我们就得到了一个充要条件:一个串小于等于 \(s'\) 当且仅当其 Lyndon 分解的每一部分小于等于 \(s\)

那么我们就可以上 Euler 变换,设 \(F(x)\) 为小于等于 \(s\) 的 Lyndon 串数,\(G(x)\) 为小于等于 \(s'\) 的串数,那么就有 \(G(x) = \prod_i (\frac{1}{1-x^i})^{f_i}\),施 Euler 变换即得 \(\ln(G(x)) = \sum_{i \ge 1} \frac{F(x^i)}{i}\),设 \(H(x) = \ln G(x)\),提取两边系数可以得到 \(n h_n = \sum_{k | n} k f_k\),莫比乌斯反演得到 \(f_n = \sum_{k | n} \mu(\frac nk) k h_k\),这部分可以直接 \(O(2^{\omega(n)})\) 反演得到。

剩下的问题就是计算 \(H(x)\),考虑小于等于 \(s'\) 的串有多少,可以枚举第一个不相同的位置,那么相当于将两部分卷积起来,前一部分是 \(s'_i - 1\),后一部分是 \(m^i\)。设 \(S(x) = \sum_{i=1}^n (s_i - 1) x^i\),那么 \(s'\) 对应的就是 \(\frac{S(x)}{1-x^n}\),那么答案就是 \(\frac{S(x)}{(1-x^n)(1-mx)}\),注意到还有完全相等的情况,所以还要加上一个 \(\frac{1}{1-x}\),那么就有 \(G(x) = \frac{S(x)(1-x) + (1-x^n)(1-mx)}{(1-x^n)(1-mx)(1-x)}\),这是一个次数 \(O(n)\) 的分式,我们要求 \(\ln G(x)\),直接 ODE 线性递推一下即可。

2024.4.7

CF1707D Partial Virtual Trees

感觉是这个感觉,但是没懂怎么设计状态,菜了。

集合序列不好刻画,考虑用一组序列 \(t_i\) 来表示这个集合序列,其中 \(t_i\) 表示第 \(i\) 个点被删除的时刻。容易发现根据这个序列即可得到一组集合序列。但是这样并无法保证真子集的限制,我们可以容斥一下,先计算可以相等的方案,然后再容斥一下,是个二项式反演的形式,直接做一下。现在考虑怎么做这个。

\(p_u\) 为子树内的 \(t_i\) 最大值,虚树的限制实际上是,如果一个点有至少两个子树内有点,那么这个点就不能被删除,即不存在两个子树内 \(p_v\) 均大于 \(t_u\) 的情况。那么考察 \(t_u\) 与子树内 \(p_v\) 的大小关系,有两种:

  • \(t_u \ge \max p_v\)
  • \(t_w > t_u \ge \max_{v \ne k} p_v\)

我们设 \(f_{u, k}\) 表示 \(u\) 子树内 \(p_u = k\) 的方案数,那么根据上面两种情况有两种转移:第一种是 \(f_{u, k} \gets \prod_v (\sum_{i \le k} f_{v, i})\),第二种是 \(f_{u, k} \gets \sum_{j < k}\prod_{v \ne w} (\sum_{i \le j} f_{v, i}) f_{w, k}\),简单优化一下即可 \(O(n^2)\)

CF1874E Jellyfish and Hack

有点流汗。nfls 考过一个类似的题,而且是在这之前,题目与解法的重合度比较厉害,,

反正就是直接 DP 然后插值优化就好了,复杂度 \(O(n^4)\)

2024.4.8

T2 考拉爆炸

定义以下随机过程:给定一个长度为 \(m\) 的实数序列 \(a_m\) 和概率序列 \(p_m\),与一个实数 \(w\),保证 \(\sum p_m = 1\),令 \(X\) 为随机变量,有 \(\frac{p_i}{2}\) 的概率为 \(a_i\),有 \(\frac{p_i}{2}\) 的概率为 \(w - a_i\),令 \(f(n)\) 表示 \(n\)\(X\) 的最小值的期望,给定 \(f(2), f(4), \cdots, f(2k)\)\(w\) 的值,求 \(f(2k + 1)\)

\(k \le 10^5\)

赛时推出来了一个做法,但是太丑了一点也不优美,大概就不写了。

我的做法中用到了一个性质,赛时没推出来为啥,这里写一下:

令函数 \(f_k(x) = (2-x)^k + x^k\),那么 \(f_{2k+1}(x)\) 可以用 \(f_0(x), f_2(x), f_4(x), \cdots, f_{2k}(x)\) 线性表出。

证明:把函数平移一下,令 \(g_k(x) = f_k(1+x) = (1-x)^k + (1+x)^k\),发现 \(g_{2k+1}(x)\) 只有偶数次项有值,一共有 \(k+1\) 个系数。而同样的,\(g_{2i}\) 只有 \(i+1\) 个系数,那么这 \(k+1\) 个函数显然线性无关,于是他们显然可以线性表出 \(g_{2k+1}(x)\)

key observation 应该是注意到所有概率分布都是关于 \(\frac w2\) 对称的,也就是说最小值期望与最大值期望应当也与 \(\frac w2\) 对称,设最大值期望为 \(g(n)\),根据 min-max 容斥可以得到:

\[\begin{aligned} f(n) &= \sum_{i=0}^n \binom{n}{i} (-1)^i g(i) \\ &= \sum_{i=0}^n \binom{n}{i} (-1)^i (w - f(i))\\ &= w [n = 0] - \sum_{i=0}^n \binom{n}{i} (-1)^i f(i)\\ \end{aligned} \]

可以得到奇数处点值 \(f(n)\)\(f(0), f(1), \cdots, f(n-1)\) 的表达式,分治 NTT 或者推一下得到多项式求逆一类的式子即可。

posted @ 2024-04-07 19:37  APJifengc  阅读(181)  评论(6编辑  收藏  举报