The 4th Universal Cup. Extra Stage 5: Shenzhen(无 M)

A. Greetings from Prof. Chen

枚举区间长度 \(l\),若 \(n\in [97n, 122n]\) 则有解,可以先构造出全 a 串然后每次选一个非 z 的字符 \(+1\)

\(l\) 变大的过程中,若 \(97l > n\) 还没构造出解,则无解。

时间复杂度 \(\mathcal{O}(n)\),实际上会带个 \(\frac{1}{97}\) 的常数。

submission

B. All-Star Showdown

学到了神秘 trick。

染色后为一个合法的二分图,对原图的每个连通块考虑。

如果某个连通块不是二分图,则无论如何染色肯定无解,答案为 \(0\)
否则对每个连通块求出染色后的两个集合 \(S_1, S_2\),答案即是 \((x^{|S_1|}\prod\limits_{i\in S_1} w_i + x^{|S_2|}\prod\limits_{i\in S_2} w_i)\) 的乘积,分治 NTT 即可。

接下来的问题是如何建出这个图。

因为每个连通块都要为二分图,若存在三元环的结构就会无解。

根据这个性质加上一些限制,考虑按 \((d / \sqrt{3}) \times (d / \sqrt{3}) \times (d / \sqrt{3})\) 的立方体分割整个空间。

\(x, y\) 在一个立方体里,则 \(x, y\) 的距离一定 \(< d\),那么若一个立方体里有 \(\ge 3\) 个点,就一定存在三元环,无解。

否则每个立方体内至多 \(2\) 个点,因为分块是按照 \(d / \sqrt{3}\) 分的,所以对于一个点 \(x\),与其距离 \(< d\) 的点所在的立方体一定在以 \(x\) 所在的立方体为中心的 \(7\times 7\times 7\) 的区域内(可以卡更紧)。
需要检验的数量并不多,所以可以暴力枚举。

时间复杂度 \(\mathcal{O}(n\log ^2 n)\),但是前面连边的部分要带一个超大的常数。

submission

C. One Item Away

是个很有趣的题,不过维基百科有与这个题近乎相同的内容,额。

首先考虑 \(n = 2\) 怎么做。

因为给的询问次数跟 \(m\) 相关,可以考虑增量。

设现在分配出了 \(S_1, S_2\),要加入 \(x\)

\(r_1(S_2) > r_1(S_1), r_2(S_1) > r_2(S_2)\),则交换 \(S_1, S_2\)

于是至多有 1 个人满足 \(r_i(S_j) > r_i(S_i)\),令 \(S_i\gets S_i \cup \{x\}\)
操作完后 \(r_i(S_i)\) 变大,所以 \(r_i\) 限制不会变坏,对于 \(r_j\) 的限制,若 \(r_j(S_i) > r_j(S_j)\),则 \(S_i / \{x\}\) 就是一个合法的删元素的方案,依然成立。

然后尝试扩展到 \(n\) 个元素。

设现在分配出了 \(S_1, S_2, \cdots, S_n\),要加入 \(x\)

发现如果存在一个 \(i\) 满足 \(\forall j, r_j(S_j) \ge r_j(S_i)\),则令 \(S_i\gets S_i\cup \{x\}\) 一定可行,原因与上文相同。

不过有一个问题是每个 \(i\) 都能找到 \(j_i\) 满足 \(r_{j_i}(S_i) > r_{j_i}(S_{j_i})\) 该怎么办。
连边 \(i\to j_i\),那么这个图会是一个内向基环树。

于是尝试能不能对环做一些调整,假设现在找到了一个环为 \(x\to y\to \cdots \to z\to x\),也就是 \(y\) 觉得 \(x\) 比自己好,\(x\) 又觉得 \(z\) 比自己好,等等。

既然这样不妨让环上的人都能分到更优秀的物品,也就是把物品沿着环移动一步,\(S'_y = S_x, S'_x = S_z\),等等。

分析一下变换后的效果,对于 \((u, v)\) 满足 \(r_u(S_v) > r_u(S_u)\),有以下两种情况:

  • \(v\) 在环上,\(S_v\) 沿着环往后移了一步,那可以看作 \(v\) 沿着环移动了一步。
  • \(u\) 在环上,因为 \(u\) 换到了更优秀的 \(S_u\),所以 \((u, v)\) 要么保留要么没有了。

于是会发现操作后图一定不会加入新边,且原来的环边一定被删除了,一直做下去一定能使得整个图无环,就一定能找到一个 \(i\) 了。

对于询问次数,发现只需要每次增量时问一下每个人新集合的权值,恰好是 \(nm\) 次。

对于时间复杂度,考虑每次增量至多加入 \(m\) 条边(以 \(i\) 为终点的边),加入的总边数是 \(\mathcal{O}(nm)\) 的,操作环可以在 \(\mathcal{O}(n^2)\) 的复杂度内完成并且至少减少一条边,复杂度是 \(\mathcal{O}(n^3m)\) 的。

submission

D. City Management

因为每经过一个 W 就可以重新分配,这说明两个 W 其实是相对独立的。

于是按照 W 分段,记 W 的位置为 \(p_{1\sim m}\),令 \(p_{m + 1} = n + 1\),对每个 \([p_i, p_{i + 1})\) 的情况分开考虑。

分析一下不同的 \(x_j\) 产生的贡献,若 \(j < p_i\),则贡献为 \(x_j(p_{i + 1} - p_i)\),若 \(p_i\le j < p_{i + 1}\),则贡献为 \(x_j(p_{i + 1} - j)\)

看起来就是 \(p_i\le j < p_{i + 1}\) 更难处理,不过考虑到此时 \(j\) 的数量只有 \(p_{i + 1} - p_i\),可以尝试均摊来做。

对于 \(j < p_i\) 的不能均摊,不过对于这部分贪心的想法是简单的,就是按照 \(x_j\) 从大到小选,所以可以用对顶堆先维护 \(j < p_i\) 中前 \(i\) 大的和 \(s\),此时至少有 \(s\times (p_{i + 1} - p_i)\) 的贡献。

然后来考虑 \(p_i\le j < p_{i + 1}\) 的贡献,因为只关心 \(x_j(p_{i + 1} - p_i)\) 的值,将其贪心的从大到小排序,记为 \(v_{1\sim p_{i + 1} - p_i}\)

考虑替换,贪心的优先替换 \(v_1\),若 \(v_1 > (p_{i + 1} - p_i) \times\)\(k\) 大值,则可以踢出第 \(k\) 大值转而得到 \(v_1\) 的贡献。
接下来继续考虑 \(v_2\),因为第 \(k\) 大值已经被踢了,所以就需要和第 \(k - 1\) 大值做比较。
若比较之后不如原本的值优,则用更小的值去替换肯定也不优,就不需要替换了。

此时最多比较 \(p_{i + 1} - p_i\) 次,最多踢 \(p_{i + 1} - p_i\) 次,依然可以均摊,只需要用个 vector 之类的数据结构记录一下被踢走的值算完贡献再放回堆即可。

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

submission

E. Card Checking

很好玩的题。

对比一下会发现 B 的限制是比较紧的,因为 B 之后直接就是 C,要么出牌能让 B 出玩,否则 B 一定不能打比单 \(p_c\) 劣的牌。

于是先来解决 A 把局面交给 B,B 能赢的情况。

首先一个条件是 A 能把牌权交给 B,判一下 1,2 中 A 的最小牌和 B 的最大牌的大小关系即可。

其次发现 A 在交出牌权后再去掺和肯定是不优的,于是剩下的牌一定都是 B 来打,只需要满足 \([1, p_c)\) 中 B 至多有 \(1\) 个 1 即可。

还有一些小细节,比如若 B 只有 \(1\) 个 1 还是 \(< p_c\) 的,那么 A 通过 1 把牌权交给 B 会让 C 直接赢,但如果 B 的手牌就只有这 \(1\) 个 1 是能赢得。

判定完后若 B 赢不了,则 B 只能当一个传递的作用,也就是防止 A 打出的 \(< p_c\) 的单牌能让 C 赢,又因为自己赢不了所以再把牌权交给 A。

记 A 中 \(< p_c\) 的 1 有 \(c\) 个,有 \(1\) 张可以放在最后打出,有 \(c' = \max(c - 1, 0)\) 张是必须要 B 来辅助的,所以 B 中 \(\ge p_c\) 的 1 的数量应当 \(\ge c'\)

同时还要考虑 B 来把牌权交回去的限制,对于 B 的一种牌,A 就应该出更大的牌来得到牌权,于是限制就是这样的配对数量需要 \(\ge c'\)

这也是可以构造出来的,把这类配对分为两类:

  • 一类满足 B 这边的牌也会辅助 A,这类牌在 A 打出后紧接着打出,然后会继续打出配对的牌。
  • 还有一类满足 B 这边的牌不用辅助,那么当一个 A 打出再紧接着打出一张 B 且这张 B 没有配对时先把牌权交给 B,让 B 打出这张牌后 A 打出配对的牌,牌权就回到了 A。

需要注意的是 B 的 \(< p_c\) 的 1 是不能参与配对的,因为打出来就会让 C 赢。

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

submission

F. Astra

当选中一个起点后,此时每个子树的博弈是独立的,这说明 sg 是肯定要算的。

此时至少要算出 \(f(u, v)\) 表示以 \(u\) 为根,且不包含 \(v\) 这个邻点的子树的 sg 值,其中选中的路径一定是 \(u\) 往下的长度为 \(1\sim k\) 的链。

转移因为路径的一段已经确定,所以可以往下递归暴力维护这条链的 sg 值。
此时一条链对应的 sg 值就是把这条链删掉后剩下的每个子树以最高点为根的 sg 值的 xor,会发现涉及的状态其实和上文的 \(f(u, v)\) 是相同的。

于是可以先把子树中的 \(f(u', fa_{u'})\) 求出来,再向下递归维护 sg 值,然后求所有链的 sg 值的 mex,得到的值就是 \(f(u, v)\)

此时状态数只有 \(\mathcal{O}(n)\) 种,可以对每条边 \((u, v)\) 分析。

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

submission

G. Snake

有一个避免不撞的想法就是构造一条链把这 \(nm\) 个点都串起来,每次只在链上移动,就始终不可能撞了。

会发现当 \(n, m\) 有一个为偶数时就可以构造出来,例如 \(n\) 是偶数时可以这样构造:

RRRRD
UDLLL
URRRD
ULLLL

不过 \(n, m\) 都为奇数时会发现构造不出来。

考虑到收集到最后一个苹果后就会直接结束,这相当于没有要求最后的状态一定要能走。

于是可以构造两个 \(nm - 1\) 步的路径,其中交为 \(nm - 2\),也就是只存在 \(2\) 个点分别在不同的路径中,这样子可以根据苹果的位置自由切换,可以结合以下例子考虑。

\(n = 5, m = 5\) 时构造如下:

RRRRD
xUDLL
ULRRD
RUDLD
ULLUL

其中 \((2, 1)\) 处填为 RD 会分别对应两条过 \((1, 1)\) 和过 \((2, 2)\) 的路径。

submission

H. Telepathy

高妙🤯。

因为 0 的数量比 1 多,尝试把 0 和 1 进行一些匹配。

例如当 \(k = \lfloor\frac{n}{2}\rfloor\)\(n\) 为奇数时),此时是一个很极端的情况,因为构造出来的得是个双射。
此时因为 0 恰好比 1 多 \(1\) 个,考虑把序列扩展成环,在这上面匹配“01”,也就是把 0 当作左括号 1 当作右括号,此时失配的 0 是确定的,如果换成 1,1 一定也是失配的,于是就构造出来双射了。

不过此时扩展到 \(k\) 更小的情况反而不好扩展,因为此时失配的 0 不止一个不好确定了。

不妨还是回到序列,观察序列的“01”匹配,匹配完后失配情况一定如 11000 的样子,受刚刚的想法启发,想把 0 变成 1 且 1 依然失配,那么把最靠前的 1 个 0 改成 1 就好了,因为 0 数量更多,一定可以。
复原回去也是简单的,因为最靠前的 0 变换后就变成了最靠后的 1,把最后一个失配的 1 改成 0 就好了。

submission

I. Calendar Cubes

状态数虽然直接看起来有 \(10^{12}\),但是想一想就感觉很能往下缩减。

首先 \(9\) 可以全部变成 \(6\),于是就只有 \(9\) 个数了。

且对于一个骰子,具体数字的顺序是不重要的,可以直接认为是有序的,此时就只有 \(\sim 3000\) 个状态了。

再进一步,重复元素完全是没用的,所以只关心骰子上数字的不可重集,就只有 \(\sim 500\) 个状态了。

然后直接枚举两个骰子的状态暴力求 mex 即可。

submission

J. Crossroads

因为横向的权值 \(t_0\) 是固定的,若一条路径经过了两条不同的竖线,则可以把代价大的那一条平移到代价小的部分而横向的权值不改变。

所以对于一条路径只会经过一次竖线。

那么就可以写出 \(f(i, j) = \min_{k = 1}^n (2 \max(a_i, a_k) t_0 + b_j t_k) - a_i t_0\)

这里面的 \(\max(a_i, a_k) = a_{\max(i, k)}\) 看着太丑了,于是记 \(t'_k = \min_{i = 1}^{k} t_i\),就可以把 \(k\le i\) 的部分直接替换为 \(t'_i\)
进一步的,发现若 \(k > i\)\(k\) 如果不是前缀最小值一定不优,所以直接用 \(t'_k\) 替换掉 \(t_k\) 也不会有问题。

于是用 \(t\) 的前缀 \(\min\) 替换掉 \(t\),可以转为 \(f(i, j) = \min_{k = i}^n (2 a_k t_0 + b_j t_k) - a_i t_0\)

这里的 \(k \in [i, n]\) 说明可以让 \(i\)\(n\) 倒着扫到 \(1\),每次在 \(k\in [i + 1, n]\) 的基础上加入 \(k = i\) 的信息。
同时通过历史和处理 \(i\) 上这一维的询问,\(j\) 这一维的询问直接线段树求和即可。

接下来的问题就只剩下如何加入 \(k = i\) 的信息了。

直觉感受一下,若 \(j\) 越小,则选中的 \(k\) 应该更小,因为此时 \(b_j\) 并不大,若 \(j\) 很大,则 \(b_j\) 的占比大了就会使更大的 \(k\) 权值可能更小。
也就是说对于任意 \(k_1, k_2\),应该存在单调性满足 \(j\) 在一个前缀中 \(k_1\) 优,在剩下的后缀中 \(k_2\) 优。

于是可以使用决策单调性优化中单调栈的想法来实现。
也就是维护一个栈 \((k_i, r_i)\) 表示 \(j\in (r_{i + 1}, r_i]\) 时为 \(k_i\) 取到最小值,\(i\) 越大越靠近栈顶 \(r_i\) 越小。
当加入 \(k\) 时若 \(k\) 相对栈顶 \((k_i, r_i)\)\(r_i\) 处取值都更优,则这一部分可以全部替换为 \(k\),弹栈;否则在这一段二分找到分界点,分界点之后 \(k\) 不可能取到最小值,之后的信息就不用考虑了。

又因为求解 \(val(j, k) = 2t_0 a_k + b_jt_k\) 可以 \(\mathcal{O}(1)\) 求出,整个过程可以在 \(\mathcal{O}(n\log n)\) 的复杂度内完成。

对于线段树,考虑每个节点维护 \(4\) 个信息的向量 \(\begin{bmatrix}\sum s, s, \sum b_j, \sum 1\end{bmatrix}\)

每次加入 \(k = i\) 的信息后的操作形如 \(sum\gets \sum (Ab_j + B) = A \sum b_j + B \sum 1\)
更新历史和的操作形如 \(\sum sum \gets \sum sum + sum + A \sum 1\)(注意不要漏了 \(-a_i t_0\) 的贡献)。

以上两个操作都可以写成 \(4\times 4\) 的矩阵形式,可以线段树维护。

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

因为涉及 \(4\times 4\) 的矩阵乘法,常数有点大,有 2 个卡常方法:

  1. 观察一下这个矩阵只会在下三角的区域有值,枚举时可以卡一下变量的范围。
  2. \(998244353^2 \times 4\) 是在 long long 范围内的,可以到最后再取模。

submission

K. Sum and Product

移一下项:\(ab - k(a + b)\equiv 0 \pmod n\)
左式看着就缺了个 \(k^2\),考虑补上:\((a - k)(b - k)\equiv k^2 \pmod n\)

因为 \(0\le a, b < n\),所以 \((a - k) \bmod n, (b - k)\bmod n\) 也是 \([0, n)\) 中的值。

于是有 \(f(n, k) = \sum\limits_{a = 0}^n \sum\limits_{b = 0}^n [ab\equiv k\pmod n]\)

不太能拆掉两层 \(\sum\),但是拆掉 \(b\) 是可以的。

考虑记 \(d = \gcd(a, n)\),若 \(d \nmid k^2\) 则肯定不存在 \(b\),否则 \(ab\equiv k^2\pmod n\) 可以转为 \(\frac{a}{d} b \equiv \frac{k^2}{d} \pmod {\frac{n}{d}}\)
此时因为 \(\gcd(\frac{a}{d}, \frac{n}{d}) = 1\),所以 \(\frac{a}{d}\) 存在逆元,也就唯一确定了 \(b\bmod \frac{n}{d}\) 的值,对应到 \(b\bmod n\) 就会有 \(d\) 个值。

于是可以对每个 \(d \mid n\) 算贡献,\(a\) 会有 \(\varphi(n / d)\) 个,\(b\) 会有 \(d\) 个。
所以有 \(f(n, k) = \sum\limits_{d\mid n, d\mid k^2} \varphi(n / d) d\)

此时 \(d\) 就已经拆的拆不多了,考虑把外层的 \(\sum\limits_{k = 0}^m\) 加进去:\(\sum\limits_{k = 0}^m \sum\limits_{d \mid n, d \mid k^2} \varphi(n / d)d = \sum\limits_{d\mid n} \varphi(n / d)d \sum\limits_{k = 0}^m [d \mid k^2]\)

考虑从 \(d\mid k^2\) 反确定 \(k\)
\(d = \prod\limits_{i} p_i^{e_i}, r(d) = \prod\limits_{i} p_i^{\lceil e_i / 2\rceil}\),只要 \(r(d)\mid k\) 即可。

于是答案可以继续转为 \(\sum\limits_{d\mid n}\varphi(n / d) d (\lfloor\frac{m}{r(d)}\rfloor + 1)\)

因为 \(\varphi(n / d), d, r(d)\) 都是关于 \(p_i^{e_i}\) 独立的,可以先分解质因数,然后搜索,暴力枚举 \(d\)\(p_i\) 的幂次以遍历全部的 \(d \mid n\),同时维护与 \(d\) 有关的值。

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

submission

L. Critical Strike

考虑知道了选择的 \((p_i, v_i)\) 后怎么算贡献。

因为只有最大的会生效,一个想法是按照 \(v_i\) 从大往下扫,动态维护当前期望和前面都失败的概率,但是这样做就逃避不了维护概率,扩展不了。

另一个思路是按照 \(v_i\) 从小往大扫,每次只需要维护前 \(i\) 个值的期望 \(E_i\),根据当前 \(p_i\) 是否成功有转移 \(f_i = p_i v_i + (1 - p_i)e_{i - 1}\),这个就能扩展了。

考虑把所有 \((p_i, v_i, w_i)\) 按照 \(v_i\) 升序排列依次考虑。

维护 \(f_{i, j}\) 标识前 \(i\) 个物品中选出的重量总和为 \(j\) 的最大期望,有转移 \(f_{i, j} = \max(f_{i - 1, j}, p_iv_i + (1 - p_i)f_{i - 1, j - w_{i}})\)

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

submission

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