The 4th Universal Cup. Stage 1: Grand Prix of Korolyov

A. Grid Problem

😋。

看到 \(2\times 2\)\(3\times 3\) 的矩阵,尝试拼凑出一些小矩阵:\(\begin{bmatrix} 2 & 5 & 2 \\ 5 & 5 & 5 \\ 2 & 5 & 2\end{bmatrix} - \begin{bmatrix} 2 & 1 & \ \\ 1 & 2 & \ \\ \ & \ & \ \end{bmatrix} - \begin{bmatrix} \ & 4 & 2 \\ \ & 2 & 4 \\ \ & \ & \ \end{bmatrix} - \begin{bmatrix} \ & \ & \ \\ 4 & 2 & \ \\ 2 & 4 & \ \end{bmatrix} - \begin{bmatrix} \ & \ & \ \\ \ & 2 & 1 \\ \ & 1 & 2 \end{bmatrix} = \begin{bmatrix} \ & \ & \ \\ \ & -3 & \ \\ \ & \ & \ \end{bmatrix}\)

所以可以认为只有 \(\begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}\)\(\begin{bmatrix} 3 \end{bmatrix}\) 这两个矩阵。

\(\begin{bmatrix} 3 \end{bmatrix}\) 意味着可以单点 \(\pm 3\),于是可以放在 \(\bmod\ 3\) 意义下考虑。

发现 \(\begin{bmatrix} 1 & 2 \\ 2 & 1 \end{bmatrix}\) 不会改变每一行和每一列和 \(\bmod\ 3\) 的值,于是找到了一个必要条件:每行每列和 \(\bmod\ 3 = 0\)

这也是充分的,考虑每次删掉第 \(1\) 行和第 \(1\) 列,通过操作 \((1, 1), (i, 1), (1, j), (i, j) (i, j\ge 2)\) 使得 \((i, 1), (1, j)\) 都为 \(0\)\((1, 1)\) 也因为限制会是 \(0\),接下来可以继续递归,最后到 \(n = 1\) 一定合法。

所以要计数的就是值域 \([0, k]\) 且每行每列和 \(\bmod\ 3 = 0\) 的矩阵数,也即 \(\displaystyle\sum\limits_{a}\left(\prod\limits_{i = 1}^n \left[\sum\limits_{j = 1}^m a_{i, j}\bmod 3 = 0\right] \prod\limits_{j = 1}^m \left[\sum\limits_{i = 1}^n a_{i, j}\bmod 3 = 0\right]\right)\)

考虑用单位根反演替换掉 \(\bmod\ 3 = 0\) 的部分,再进行一些变形把 \(k\) 这个值换走:

\[\begin{aligned} & \sum\limits_{a}\left(\prod\limits_{i = 1}^n \left[\sum\limits_{j = 1}^m a_{i, j}\bmod 3 = 0\right] \prod\limits_{j = 1}^m \left[\sum\limits_{i = 1}^n a_{i, j}\bmod 3 = 0\right]\right)\\ = & \frac{1}{3^{n + m}} \sum\limits_{a} \left(\prod\limits_{i = 1}^n \left(\sum\limits_{x = 0}^{2} \omega_3^{x\sum_{j = 1}^m a_{i, j}}\right) \prod\limits_{j = 1}^m \left(\sum\limits_{x = 0}^2 \omega_3^{x \sum_{i = 1}^n a_{i, j}}\right)\right)\\ = & \frac{1}{3^{n + m}} \sum\limits_{a} \left(\prod\limits_{i = 1}^n \left(\sum\limits_{x = 0}^{2} \prod\limits_{j = 1}^m \omega_3^{x a_{i, j}}\right) \prod\limits_{j = 1}^m \left(\sum\limits_{x = 0}^2 \prod\limits_{i = 1}^n \omega_3^{x a_{i, j}}\right)\right)\\ = & \frac{1}{3^{n + m}} \sum\limits_{a} \left( \sum\limits_{r_i\in [0, 2]} \prod\limits_{i = 1}^n \prod\limits_{j = 1}^m \omega_3^{r_i a_{i, j}} \right)\left( \sum\limits_{c_j\in [0, 2]} \prod\limits_{i = 1}^n \prod\limits_{j = 1}^m \omega_3^{c_j a_{i, j}} \right)\\ = & \frac{1}{3^{n + m}} \sum\limits_{a} \sum\limits_{r_i, c_j\in [0, 2]} \prod\limits_{i = 1}^n\prod\limits_{j = 1}^m \omega_3^{(r_i + c_j) a_{i, j}}\\ = & \frac{1}{3^{n + m}} \sum\limits_{r_i, c_j\in [0, 2]} \prod\limits_{i = 1}^n \prod\limits_{j = 1}^m \sum\limits_{a_{i, j} = 0}^k \omega_3^{(r_i + c_j) a_{i, j}} \end{aligned} \]

定义 \(f(x) = \sum\limits_{i = 0}^k \omega_{3}^x\),这是可以 \(\mathcal{O}(1)\) 求得的,原式变为:

\[\begin{aligned} \frac{1}{3^{n + m}} \sum\limits_{r_i, c_j\in [0, 2]} \prod\limits_{i = 1}^n \prod\limits_{j = 1}^m f(r_i + c_j) \end{aligned} \]

枚举 \(r_0, r_1, c_0, c_1\) 的个数,就有了一个 \(\mathcal{O}(n^4)\) 的做法。

考虑到上述式子不能快速求解的问题是每个格子 \((i, j)\) 都受到了 \(r_i, c_j\) 两个值影响,导致每个 \((i, j)\) 都是不同的。

那如果说 \(r_i\) 确定的情况下,每个格子就只受 \(c_j\) 限制了,于是就可以对每个列单独考虑了,形式化表达就是:

\[\begin{aligned} &\frac{1}{3^{n + m}} \sum\limits_{r_i, c_j\in [0, 2]} \prod\limits_{i = 1}^n \prod\limits_{j = 1}^m f(r_i + c_j)\\ = & \frac{1}{3^{m + m}} \sum\limits_{r_i\in [0, 2]} \prod\limits_{j = 1}^m \sum\limits_{c_j = 0}^2 \prod\limits_{i = 1}^n f(r_i + c_j)\\ = & \frac{1}{3^{n + m}} \sum\limits_{r_i\in [0, 2]} \left(\sum\limits_{x = 0}^2 \prod\limits_{i = 1}^n f(r_i + x)\right)^m \end{aligned} \]

括号里的值在知道 \(r_0, r_1, r_2\) 后可以 \(\mathcal{O}(\log n)\) 求出。

于是只需要枚举 \(r_0, r_1\),得到 \(r_2\) 算出对应值后乘上 \(r\) 的方案数 \(\binom{n}{r_0, r_1, r_2}\)

时间复杂度 \(\mathcal{O}(n^2\log n)\)

submission

B. Domain Compression

这个操作就是把 \(u\) 删掉并且把 \(u\) 的所有邻点都连上边。
进一步的,发现删掉一个连通块就会把连通块的所有邻点连上边。

考虑对每对 \((u, v)\) 算贡献,能被算到贡献当前仅当 \(u, v\) 没被删除且 \(u, v\) 简单路径上的点都被删除。

于是 \((u, v)\) 路径上的点数相同的对可以放在一起处理,可以用点分治和 NTT 在 \(\mathcal{O}(n\log^2 n)\) 的复杂度内统计出 \(f_i\) 表示 \((u, v)\) 简单路径上有 \(i\) 个点(不含 \(u, v\))的数量。

考虑 \(i\) 贡献给答案的 \(k\) 的系数,首先要从其他的 \(n - 2 - i\) 个点中选出 \(k - i\) 个点,然后让这 \(k!\) 个点任意排列,也就是 \(f_i \binom{n - 2 - i}{k - i} k!\to \operatorname{ans}_k\),卷积即可。

时间复杂度 \(\mathcal{O}(n\log n)\)

submission

C. Staple Stable

枚举行切出来的最大值为 \(i\),列切出来的最大值为 \(j\),就需要 \(\lfloor\frac{h - 1}{i}\rfloor + \lfloor\frac{w - 1}{s}\rfloor\) 刀。

而在 \(i\) 确定的情况下,因为 \(ij\le s\),贪心考虑 \(j\) 一定是取到 \(\lfloor \frac{s}{i} \rfloor\),整除分块即可。

时间复杂度 \(\mathcal{O}(\sqrt{s})\)

D. Sequence Is Not Subsequence

很有趣的题😍。

虽然题目要求包含所有子序列,但是想一下会发现只考虑删掉一个字符形成的子序列即可,删掉更多字符的子序列肯定会被包含。

然后会发现相同字符所构成的连续段内的字符删掉其的子序列是相同的。

那么每个连续段肯定都要保留长度 \(-1\) 个该字符,例如:

s  : aaa|bbb|ccc|ddd
ans: aa??bb??cc??dd?

接下来考虑删掉一个字符所对应的子序列该如何体现。

首先因为需要有删掉最后一个字符所对应的子序列,所以前面的段应当还需要一个字符:

s  : aaa|bbb|ccc|ddd
ans: aaa?bbb?ccc?dd?

接下来考虑删掉倒数第二个段的字符,此时希望不会有当前段多的那个的字符且有下一个段的字符,也就是让下一段的字符更靠前,所以可以这样构造:

s  : aaa|bbb|ccc|ddd
ans: aaa?bbb?ccdcdd?

如法炮制,可以得到最终构造:

s  : aaa|bbb|ccc|ddd
ans: aababbcbccdcdd

时间复杂度 \(\mathcal{O}(n)\)

submission

E. Coffee Shops

原图一共只有 \(3n\) 条边,所以有答案上界 \(\lfloor\frac{3}{2}n\rfloor\)

这说明期望下 \(2\) 对内外的点就需要 \(3\) 个合法的点,尝试构造一下会是这样的结构:
\( \begin{bmatrix} 1 & 4\\ 2 & 3 \end{bmatrix} \)

其中 1 已经满足条件,4 钦定不满足条件,2 3 都需要左侧右侧的上方要比其大。

那么把 2 个结构拼在一起,让左边的 3 和右边的 2 满足条件,只需要把相邻的部分微调成如下方式即可:
\( \begin{bmatrix} 1 & 5 & 3 & 8 \\ 2 & 4 & 6 & 7 \\ \end{bmatrix} \)

接下来考虑奇数的情况,此时只需要能有 \(1\) 个合法的点,在多出来的一列放上:
\(\begin{bmatrix} 1\\ 2n \end{bmatrix}\)

对于偶数的情况,如果把 \(\frac{n}{2}\) 个结构拼在一起会发现大小关系成了环不可能构造出来,于是无法取到上界,不过可以去到上界 \(-1\),只需要把一个块换为:
\( \begin{bmatrix} 1 & 2n\\ 2 & 2n-1 \end{bmatrix} \)

submission

F. Yet Another MST Problem

考虑 kruskal 按边权从小到大连边。

于是枚举 \(\operatorname{mex} = x\),此时若两个线段在序列中不包含 \(x\),这两个线段的边权一定 \(\le x\),若 \(< x\) 则之前也已经连通了,无所谓。

刻画一个线段在序列中不包含 \(x\) 只需要满足 \(r < p_x\)\(p_x < l\),其中 \(p_x\)\(x\) 的位置。

所以每次需要连的边是按 \(r\) 升序排序后的一个前缀,\(l\) 降序排序后的一个前缀,以及可能在这两部分之间有连边。

因为已经连通的不需要再连,所以前两部分可以维护一个指针表示满足前缀已经连通到哪了,每次只往后移,就只需要检查 \(\mathcal{O}(n)\) 了。
对于最后一部分,因为两部分各自的前缀都已连通,所以若 \(r\) 最小的区间和 \(l\) 最大的区间满足条件只检查这两个区间就可以了,也只需要检查 \(\mathcal{O}(n)\) 次。

时间复杂度 \(\mathcal{O}(n\log n)\)

submission

G. Cyclic Topsort

神题🤯。

若题目的限制是 \(i\in [1, l]\),答案就是拓扑排序能拓扑出的点数。

但题目实际限制是 \(i\in [2, l]\),这相当于可以忽略起点的限制,也就是可以删掉一个点的所有入边拓扑排序的点数。

首先能直接拓扑出的点无论如何也会算入答案,直接删去这些点。

剩下的点就必须要删去一个点才可能被拓扑出,考虑删掉哪些点可以拓扑到 \(u\)
考虑维护点集 \(S\) 表示当前应当要被拓扑的点,初始 \(S = \{u\}\),每次可以选择一个 \(v\in S\)\(S\gets (S - \{v\})\cup in_v\),每当 \(|S| = 1\)\(S\) 中的那个点 \(w\) 就满足删掉 \(w\) 能拓扑到 \(u\)

虽然这么做是做不了的(应该吧?),但是画一画能感受到一种包含关系。

具体来说,设 \(S_u\) 表示删掉 \(u\) 能拓扑到的点,\(S_u, S_v\) 要么不交要么成包含关系。
因为 \(S_u, S_v\) 交且不呈包含关系,则肯定 \(u\not \in S_v, v\not \in S_u\),任意找到一个 \(S_u\cap S_v\) 中的元素 \(w\),那就要满足从 \(w\) 往前扩张能单独扩张到 \(u\) 也能单独扩张到 \(v\),这肯定是不行的。

于是 \(S_u\) 根据包含关系可以连成一个树形结构。

但是知道这个还是不好做,因为求解 \(S_u\) 还是只能暴力拓扑。

考虑优化一下,若对于一个点 \(v\) 存在一个已经跑出的点 \(u\) 满足 \(v\in S_u\),那么可以推出 \(S_v\subseteq S_u\)\(v\) 就不需要再跑了。

随机打乱要求解 \(S_u\) 的点集,对于 \(S_u\) 树上深度为 \(d\) 的点,期望被遍历次数为 \(1 + \frac{1}{2} + \cdots + \frac{1}{d}\),是 \(\mathcal{O}(\ln d)\) 级别的。

所以期望复杂度为 \(\mathcal{O}(m\log n)\)

submission

H. Misread Problem

首先答案即为 \(\operatorname{cost}(b, a) = \frac{1}{2}\sum\limits_{i = 1}^n |a_i - b_i|\)

于是可以把每个 \(i\) 单独拆出来,\(b_i\) 从小到大的贡献应当是一个凸函数,计算每个斜率的数量后贪心即可。

时间复杂度 \(\mathcal{O}(nk)\)

submission

I. troS XEM

因为每次取 \(\max\) 的只有 \(3\) 个数,得到的值肯定 \(\le 3\)

于是可以写一个区间 dp,\(f_{l, r, x}\) 表示 \([l, r]\) 这个区间能不能凑出 \(x\) 这个数。
然后可以记一个 \(g_{i, x}\) 表示考虑了前 \(i\) 个数最后一个数是 \(x\) 最小代价,特殊处理一下末尾 \(> 3\) 的数就可以求答案了。

不过 \(f_{l, r, x}\) 的范围是 \(\mathcal{O}(n^2)\) 的,肯定是跑不了的。

此时有个想法是若区间长度足够长,\(0\sim 3\) 应该都能凑出来。
跑一下发现,发现若长度 \(\ge K = 17\) 则能凑出 \(0\sim 3\)

那么实际上 \(f_{l, r, x}\) 就只需要保留 \(r - l + 1 < K\) 的状态了,且 \(g_{i, x}\) 转移时若当前区间长度 \(\ge 3K\) 则可以拆成 \(3\)\(\ge K\) 的区间,所以转移区间长度不会超过 \(3K\)

\(f_{l, r, x}\) 的转移可以通过分步转移做到 \(\mathcal{O}(nk^2)\),不过 \(\mathcal{O}(nk^3)\) 已经可以通过了。

为了优化转移常数,把 \(f_{l, r, *}\) 压成一个二进制数且预处理转移结果。

我写的 \(\mathcal{O}(nk^3)\)

submission

J. Yet Another Constructive Problem

搬一下之前写的题解

首先如果 \(k > \operatorname{LIS}(a)\) 则一定无解。

先来考虑 \(k = 1\) 时怎么做。

\(\operatorname{LIS}(b) = 1\) 就相当于是限制 \(b\) 必须是降序排列,于是跑出 \(a\) 的最长下降子序列,若长度 \(< m\) 则无解,否则任意选取 \(m\) 个元素即可。

这启发在 \(k\) 更大的时候,去找到 \(k\) 个不交的下降子序列,那么这 \(k\) 个子序列的并所构成的 \(\operatorname{LIS}\) 一定 \(\le k\)

但是这个题要求 \(= k\),那么有没有办法把 \(< k\) 的情况去掉呢?

考虑最大化子序列的总长度,这就能使子序列的 \(\operatorname{LIS} = k\)
这是因为若子序列的 \(\operatorname{LIS} < k\),那么根据 dilworth 定理,可以用 \(\operatorname{LIS}\) 个序列覆盖完这个序列,就还有 \(k - \operatorname{LIS}\) 的序列可以继续选,那么长度一定不为最长的。

需要注意的是正确性是建立在 \(k\le \operatorname{LIS}(a)\) 的前提下的。

并且发现这样求解后顺带也就求出了 \(k\) 对应的 \(m_{\max}\),若 \(m > m_{\max}\) 时则无解。

否则考虑从 \(m_{\max}\) 的序列保留下 \(m\) 个数使得此时仍然有 \(\operatorname{LIS} = k\)

这是简单的,因为长度为 \(m_{\max}\) 的序列保证了 \(\operatorname{LIS} = k\),所以可以直接跑出该序列的一个 \(\operatorname{LIS}\),保留下这 \(k\) 个数并在剩余的 \(m_{\max} - k\) 个数中随意选 \(m - k\) 个即可。

那么除了找到 \(m_{\max}\) 及对应方案以外,其他的部分都可以简单的做到 \(\mathcal{O}(n^2)\) 或者是 \(\mathcal{O}(n\log n)\),接下来就只考虑前面的部分了。

对于这个问题并没有一个很好的贪心(?),于是考虑 flow。

考虑对每个点引入入点出点 \(in(i), out(i)\),连边:

  • \((S, S', k, 0), (S', in(i), 1, 0), (out(i), T, 1, 0)\)
  • \((in(i), out(i), 1, 1)\)
  • \((out(i), in(j), 1, 0)(i < j, a_i > a_j)\)

跑最大费用最大流即可,跑出来后可以检查 \((in(i), out(i))\) 的流量便可知道 \(i\) 是否被选入子序列中。

此时用 Primal Dual 原始对偶和 \(\mathcal{O}(n^2)\) 朴素优化 dijkstra 便可做到 \(\mathcal{O}(n^3)\)

对于第三类连边,是个二维偏序的形式,可以考虑线段树 / 树状数组优化建图,使点数边数都为 \(\mathcal{O}(n\log n)\) 级别。

此时 Primal Dual 原始对偶加上堆优化 dijkatra 可以做到 \(\mathcal{O}(n^2 \log^2 n)\)

瓶颈在于最短路(此处转为了最小费用最大流),考虑到该图的边权绝对值的和为 \(n\),于是 Primal Dual 中的最短路值域也只会是 \(\mathcal{O}(n)\) 的,那么可以直接对每个 \(dis\) 开桶维护。

这样就做到了 \(\mathcal{O}(n^2\log n)\)

不过这样可能还是过不了,还需要进一步卡常。
考虑把每次跑一条增广路变为一次性找到该最短路的所有增广路,也就是把找增广路换为 dinic 即可。

这样的道理应该是增广路的权值和是 \(-n\),所以只会跑 \(\mathcal{O}(\sqrt n)\) 轮的最短路(?)。

submission

K. Robot Construction

会发现 \([0, d]\) 经过 \(a_i\) 后依然是一个前缀,具体来说 \(f_{i}(d) = \begin{cases} d & d < a_i & \\ a_i - 1 &a_i\le d < 2a_i \\ d - a_i & 2a_i\le d\end{cases}\)

应该可以线段树维护分段函数的,但其实有更好的做法。

考虑固定 \(r\)\(d_l\) 关于 \(l\) 是单调不降的,于是把询问离线下来 \(r\) 从前向后扫,每次经过 \(r\) 的变化可以直接通过线段树二分找到两个分界点打 tag 修改。

一个巧妙写法是赋值为 \(a_i - 1\) 可以用连续段均摊,所以可以通过维护区间的 \(\min, \max\) 做到只需要区间减法的 tag。

时间复杂度 \(\mathcal{O}((n + q)\log n)\)

submission

posted @ 2026-05-20 21:25  rizynvu  阅读(15)  评论(0)    收藏  举报