The 4th Universal Cup. Extra Stage 4: Chongqing

A. New Gomoku

一个点被加入后新产生的五连因为要包含这个点只会有 \(\mathcal{O}(1)\) 种,枚举判断即可。

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

submission

B. Abstract Portal

只有 \(c_p\bmod k = 0\) 能向后走,所以初次到达 \(i\) 时一定满足所有 \(j < i\) 都有 \(c_j\bmod k = 0\)

于是设计状态 \(f_i\) 表示刚到 \(i\)\(c_i\bmod k = 0\),要再经过多少步走到 \(i + 1\)

对于传送回更前的点,考虑一个递归的过程,把整个过程看做是 \(i\to i - t_{c_i} \rightsquigarrow i - t_{c_i} + 1\rightsquigarrow \cdots \rightsquigarrow i - 1\rightsquigarrow i\),而每个 \(x\rightsquigarrow x + 1\) 都对应着刚到 \(x\)\(c_x\bmod k = 0\),要经过一些步数走到 \(c_{x + 1}\),符合 \(c_x\) 的定义。

加上每次从 \(i\) 走出去的 \(1\) 步,就有转移式 \(f_i = k + \sum\limits_{j = 1}^{k - 1}\sum\limits_{h = i - t_j}^{i - 1} f_h\)

需要注意的是这个转移式只对 \(i\ge \max t\) 有效,因为当 \(i < t_j\) 时按照题意所述不会传送,不过这只需要小小改动一下。

总的路径可以写做 \(0\rightsquigarrow 1\rightsquigarrow \cdots \rightsquigarrow n\),答案也就是 \(\sum\limits_{i = 0}^{n - 1} f_i\)

\(i < \max t\) 时直接 dp,当 \(i\ge \max t\) 时因为转移形式相同,可以矩乘优化。

时间复杂度 \(\mathcal{O}((\max t)^2 k + (\max t)^3\log n)\)

submission

C. GPA Optimization Plan

类似分数规划的想法,考虑二分判定值能否 \(\ge x\),移项后就可以转成 \(\sum\limits_{i = 1}^n s_i(g_i - x)\ge 0\) 的形式。

贪心的考虑,对于一个学期中的 \((s_i, g_i)\),就肯定是把 \(s_i(g_i - x)\) 最小的对删掉(如果最小值 \(\ge 0\) 则不删)。

对每个学期用李超线段树维护上述一次函数即可。

时间复杂度 \(\mathcal{O}(nm\log^2 \frac{V}{eps})\)

卡卡常就跑过去了。

submission

D. Route Investigation

😅。

首先能够发现 \(i\) 的答案就是 \([x^{c_i}]\prod\limits_{j = 1}^{i - 1} F_j(x)\prod\limits_{j = i + 1}^{n} G_j(x)\),其中 \(F_i(x) = g_i + r_ix + y_ix^2, G_i(x) = g'_i + r'_ix + y'_ix^2\)

根据题目限制,发现 \(c_i\) 一定满足相邻项差的绝对值 \(\le 2\),这说明对于长为 \(len\) 的区间,内部 \(c_i\) 极值的差距只有至多 \(2len\)

于是考虑类似分治的过程,处理区间 \([l, r]\) 的答案时维护 \(\prod\limits_{i = 1}^{l - 1} F_i(x) \prod\limits_{i = r + 1}^n G_i(x)\)
此时会发现多项式只有 \([\min c_i - 2len, \max c_i]\) 的项是可能贡献给答案的,而这段的长度是 \(\mathcal{O}(len)\) 的,只截取这部分后正常做 NTT 递归即可。

同时需要预处理分治过程中每个区间 \(F_i(x), G_i(x)\) 的乘积。

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

submission

E. Dinner Invitation

在选中的所有人中,只有 \(r_i\) 最小的那个人的限制是最紧的,只要这个人满足条件这个集合就满足条件。

于是按 \(r_i\) 倒序排序,每次钦定最小的 \(r\) 就是当前的 \(r_i\),选中的人肯定是 \(w\) 升序排列的一个前缀。

按照 \(w\) 大小关系维护一颗线段树,每次线段树二分找到最远的合法点即可。

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

submission

F. Turtle Soup

很好玩的题。

因为最后算的答案是 \(\sum dis(x_i, x_{i - 1})\),所以每走一步就问一次肯定不劣。

首先可以问一下 \(m\),如果 \(p\) 知道这个点,说明 \(p\) 一定是 \(m\) 的后代,且不是 \(p\) 的儿子。
这时只能每次问一个 \(m\) 的儿子,如果是就继续递归,否则问下一个儿子。

于是设 \(f_u\) 表示已知 \(p\)\(u\) 子树内,现在在 \(u\) 最坏情况需要多少步找到 \(p\)

贪心的考虑,肯定是按照 \(f_v\) 从大到小问,于是设儿子按 \(f_v\) 降序,记为 \([v_0, v_1, \cdots, v_{l - 1}]\),那么有 \(f_{u} = \max\limits_{i = 0}^{l - 1} (2i + 1 + f_{v_i})\)

需要注意,如果 \(p\)\(m\) 后代,需要的次数并不是 \(f_m\)
因为已知的条件说明了 \(m\) 的儿子 \(v\) 如果是叶子则 \(p\) 肯定不是 \(v\),所以答案只需要记入不是叶子的 \(v_i\)\((2i + 1 + f_{v_i})\)

接下来考虑 \(v\) 不是 \(u\) 后代的情况,那么 \(u\) 就需要不断往上爬直到 \(p\) 知道 \(u\) 这个点,此时知道的信息是 \(p\)\(u\) 的后代,且不在刚刚爬上来的子树中。

于是对 \((u, v_i)\)\(g_{u, v_i}\) 表示从 \(v_i\) 上升到 \(u\)\(p\) 知道 \(u\) 的最坏步数。
表达式类比 \(f_u\) 可以推得 \(g_{u, v_i} = \max(\max\limits_{j = 0}^{i - 1} (2j + 1 + f_{v_j}), \max\limits_{j = i + 1}^{l - 1} (2(j - 1) + 1 + f_{v_j}))\),这可以通过维护前后缀 \(\max\) 线性处理。
需要注意的是,若 \(i = 0, l = 1\),则 \(g_{u, v_i} = -\infty\),因为此时不存在合法的 \(p\)

于是 \(m\) 的答案还要与 \(\max\limits_{i = 1} (i + g_{\operatorname{anc}(m, i), \operatorname{anc}(m, i - 1)})\)\(\max\),其中 \(\operatorname{anc}(u, i)\) 表示 \(m\)\(i\) 级祖先,这一部分是可以从根向下递推的。

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

submission

G. The Messenger

完全做不来这个题,学习了一下 ou 老师的代码。

感受一下,这个过程本身就不好确定,所以大部分的情况下 \(\max\) 下降的速度应该是挺快的。

尝试把这个过程的步数卡的尽量多,会发现 \([10^{18}, 10^{18}, \cdots, 1]\) 就会进行很多步。

感受一下,主要是 \(\min\) 和其他值差距太大了导致每次下降量很少。

于是假设当前的序列是 \([a_1, a_2, a_3, \cdots, a_{n - 1}, a_n]\),其中 \(a_n\) 远小于其他值。
此时若 \(a_1\sim a_{n - 1}\) 不是非严格降序,那么中途就会出现重复值,感觉这样做下去并不劣,所以直接假设 \(a_1\sim a_{n - 1}\) 非严格降序。

操作第 \(1\) 步后会变为 \([a_2, a_3, \cdots, a_{n - 1}, a_n, a_1 - a_n]\)
对于第 \(2\) 步,若 \(a_n\) 不是初始给定的而是相减得来的,那么有 \(a_1 - a_{n - 1}\le a_n\),故 \(a_1 - a_n\le a_{n - 1}\),最大值就为 \(a_2\),操作后变为 \([a_3, \cdots, a_{n - 1}, a_n, a_1 - a_n, a_2 - a_n]\)
\(n - 1\) 步操作后变为 \([a_n, a_1 - a_n, a_2 - a_n, \cdots, a_{n - 1} - a_n]\)
\(n\) 步操作后变为 \([a_1 - a_n, a_2 - a_n, \cdots, a_{n - 1} - a_n, a_1 - 2a_n]\)
\(n + 1\) 步操作后变为 \([a_2 - a_n, \cdots, a_{n - 1} - a_n, a_1 - 2a_n, a_n]\),又回到了上面的形式。

那么操作 \((n + 1) \times (n - 1)\) 步后,序列就应该能变为 \([a_1 - na_n, a_2 - na_n, \cdots, a_{n - 1} - na_n, a_n]\),只要初始时 \(a_{n - 1} > (n + 1)a_n\) 就能这样变换(操作到最后 \(a_{n - 1} - na_n > a_n\),保证了最小值始终是 \(a_n\))。

那么对于一个满足条件的状态,还可以尝试一次性进行多次变化,可以算出这个上界是 \(\min(\lfloor \frac{m}{(n - 1)(n + 1)}\rfloor, \lfloor\frac{a_{n - 1} - a_n - 1}{n a_n}\rfloor)\)

加上这个优化就可以通过了。

submission

H. Hot Pot

下记 Spicy 为 1 类,Non-Spicy 为 2 类。

考虑 3 种锅中只有 1 类和只有 2 类这 2 种都可以放在最后来补足没分配的人,只有既有 1 类又有 2 类的锅有点难处理。

于是考虑先枚举既有 1 类也有 2 类的锅用了多少个,配对到人上也就是优先配对该类的人,如果该类人配对完了再去配对通用的人。

接下来再去决定还没配对的通用的人该分去哪一类,贪心的想是全往 \(a, c\) 中小的那一边放。
不过考虑到每个锅可以配对两个人,所以代价多的那一边可能也会剩下 \(1\) 个还没配对的空位,也可能会去恰好 \(1\) 个人。
但是如果去 \(2\) 个人就不优了,于是分配一定满足存在一侧只会有 \(\le 1\) 个通用的人,枚举即可。

时间复杂度 \(\mathcal{O}(x + y + z)\)

submission

I. Shit

先分析合法条件。

首先必须要有马,因为如果是一个车吃掉了 S,那么 S 至少会扩张到车来的方向的那一格,S 就无法被消掉。

其次考虑一个最简单的情况,S 在一个角上,此时要消掉 S 至少需要把 S 的两侧堵住,再用一个马吃掉 S。

所以有必要条件:

  • 马的数量 \(\ge 1\)
  • 车和马的总数 \(\ge 3\)

猜测这也是充分的,直接尝试构造。

如果只有 1 个 S 且 S 在右下角,按照上文的说法构造。

否则考虑把 S 逐步移到右下角,变为上述的情况。

于是可以考虑找到一个左上角的 S(满足这个 S 的左上方没有其他 S),然后在 S 的上方和左侧都放上车或者马,再用一个车或马吃掉 S,此时 S 只会向右和向下扩张。重复执行,最后一定只会剩下一个 S 满足 S 在右下角。

处理时可以直接认为所有格都有 S,直接按照行从上至下列从左到右顺序来处理每个点。

需要注意跳的时候不能跳到 S 边界上的点,也就是不能把已经清空的点重新被 S 扩张。

每次找车或马跳到一个点跑 bfs 即可。

时间复杂度 \(\mathcal{O}(n^2m^2)\),步数是 \(\mathcal{O}(nm(n + m))\) 的。

submission

J. Tetris

若一个序列中有两个相同的元素,则其一定不是排列。
于是对于两个相同元素,分界线必须要在两个元素之间。

若这两个元素距离 \(< n\),就有一个分界线 \(\bmod\ n\) 需要在某一部分里的限制,要么是一个区间要么是前后缀。

用线段树维护,每个节点维护当前子树中满足最多限制的位置的信息和满足的限制数,最后再外层判断一下满足的限制数是不是总限制数即可。
\(n\) 可能很大,线段树可能开不下。但分析一下会发现限制分界线 \(\bmod\ n\) 的值的上界为 \(m\),所以 \(n > m\) 时线段树也只需要维护 \(\le m\) 的部分,不需要动态开点。

修改对每个值维护一个 set 即可,因为相同值中相邻元素的限制是最紧的,每次只会删去和加入 \(\mathcal{O}(1)\) 个限制。

答案要输出的是开头位置 \(\bmod\ n\) 的值,需要从分界线 \(\bmod\ n\) 的值改一下。

注意特判没有限制的情况,此时答案为所有值。

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

submission

K. Reverse KMP

好题。

模拟 KMP 匹配的过程,会有若干个相同的等价类。

每次增量一个字符,根据 KMP 时 \(j\) 指针移动过程可以知道若失配则这个字符与 \(j + 1\) 所在等价类不同,最后根据 \(kmp_i\) 是否为 \(0\) 有不同的情况。

分讨一下最后的情况:

  • \(kmp_i\not = 0\),那么 \(i\) 处的字符会与一个等价类相同,那么移动过程中不应存在与这个等价类不同的情况。

  • \(kmp_i = 0\),则 \(i\) 是一个与移动过程中等价类不同的其他字符,此时可以说明不同的等价类对应的字符一定不同。
    因为若 \(j + 1, kmp_j + 1\) 属于不同的等价类,考虑求解 \(j + 1\) 的 KMP 过程,这之中就会判断 \(j + 1, kmp_j + 1\) 这两个字符的关系,因为等价类没有合并所以这两个字符一定不同。

    于是方案数就是 \(m\ -\) 出现过的不同等价类数量。

等价类用并查集合并即可。

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

submission

L. Tiling the Floor

根据 Pólya 定理,答案可以表示为 \(\frac{1}{4n^2}\sum\limits_{t = 0}^3\sum\limits_{x = 0}^{n - 1}\sum\limits_{y = 0}^{n - 1} k^{c(t, x, y)}\),其中 \(c(t, x, y)\) 表示变换为逆时针旋转 \(t\) 次后平移 \((x, y)\) 对应的等价类数量。

接下来要做的就是快速求解 \(c(t, x, y)\) 并且压缩 \(c(t, x, y)\) 的情况。

首先把线段表示为 \((i, j, k)\) 表示左侧/下端点在 \((i, j)\) 的横线/竖线。

先来表示逆时针旋转一次后线段的变化,手玩发现有 \(R(i, j, k) = \begin{cases}(-j, i, 1) & k = 0\\ (-j-1, i, 0) & k = 1\end{cases}\),注意坐标是 \(\bmod\ n\) 意义下的。

接下来考虑 \(t = 0\),此时变换后 \((i, j, k)\to (i + x, j + y, k)\)
此时不同的 \(k\) 间是独立的,所以只需要对 \(k = 0\) 数等价类数,\(k = 1\) 是相同的。

考虑如果是 1 维的情况,即 \(i\to i + x\),容易知道此时相当于是有 \(\gcd(x, n)\) 个等价类,每个等价类内有 \(n / \gcd(x, n)\) 的周期。
扩展到 2 维的情况,\(i\)\(n / \gcd(x, n)\) 的周期,\(j\)\(n / gcd(y, n)\) 的周期,合并起来就是 \(\operatorname{lcm}(n / gcd(x, n), n / gcd(y, n))\) 的周期,于是等价类数就是 \(\frac{n^2}{\operatorname{lcm}(n / gcd(x, n), n / gcd(y, n))}。\)

所有与 \(x, y\) 有关的项都带上了 \(\gcd(x, n), \gcd(y, n)\),于是只保留 \(x \mid n, y \mid n\)\((x, y)\),计数时带上 \(\varphi(n / x)\varphi(n, y)\) 的系数即可。
此时可以继续推导上述式子:\(\frac{n^2}{\operatorname{lcm}(n / x, n / y)} = xy\gcd(n / x, n / y) = xy\times (n / \operatorname{lcm}(x, y)) = n\gcd(x, y)\)

暴力枚举 \(x, y\) 因为需要求 \(\gcd\) 复杂度是 \(\mathcal{O}(d^2(n)\log n)\) 的,已经可以通过了。

也有更优秀的做法,考虑对每个 \(z = \gcd(x, y)\) 算贡献 \(v_{z}\)
容斥求解,若只要求 \(z \mid \gcd(x, y)\),那么限制就是 \(z \mid x, z \mid y\),方案数就是 \(v'_z = (n / z)^2\)
对于 \(z\),算多了的情况就是 \(z < \gcd(x, y) = z'\) 的时候,减掉即可:\(v_z = v'_z - \sum\limits_{z \mid z' \mid n, z < z'} v_{z'}\)
这样就可以做到 \(\mathcal{O}(d^2(n))\) 的复杂度。

接下来考虑 \(t = 2\) 的情况,也就是旋转 \(2\) 次。

此时变换为 \((i, j, 0)\to (-i - 1 + x, -j + y, 0), (i, j, 1)\to (-i + x, -j - 1 + y, 1)\)
再变化一次:\((-i - 1 + x, -j + y, 0)\to (-(-i - 1 + x) - 1 + x, -(-j + y) + y, 0) = (i, j, 0)\),回到了初始点,\(k = 1\) 也是一样的。

这说明绝大多数的等价类内都是两个元素,特殊处理一下一个元素的等价类就好了。
对于 \(k = 0\) 需要满足 \(-i - 1 + x \equiv i\pmod n, -j + y \equiv j\pmod n\),也就是 \(2i\equiv x - 1\pmod n, 2j\equiv y\pmod n\)\(k = 1\) 时是 \(2i \equiv x\pmod n, 2j \equiv y - 1\pmod n\)

\(n\bmod 2 = 1\) 时一定存在 \(2^{-1}\bmod n\),所以会唯一对应到一组 \((i, j)\),此时每组 \((x, y)\) 对应的等价类数都是 \(2\times (\frac{n^2 - 1}{2} + 1) = n^2 + 1\)
\(n\bmod 2 = 0\) 时则若 \(x\bmod 2 = 1, y\bmod 2 = 0\)\(k = 0\) 能找到 \(2\)\(i\)\(2\)\(j\),就有 \(4\) 个单一元素的等价类,\(x\bmod 2 = 0, y\bmod 2 = 1\)\(k = 1\) 同样也能找到 \(4\) 个。所以有 \(n^2 / 2\) 种情况有 \(\frac{n^2}{2} + \frac{n^2 - 4}{2} + 4 = \frac{n^2}{2} + 2\) 个等价类,有 \(n^2 / 2\) 种情况有 \(\frac{n^2}{2}\) 个等价类。

接下来处理 \(t = 1 / 3\)
注意到 \(t = 3\) 也就是顺时针旋转,与 \(t = 1\) 的逆时针旋转应当是相似的,所以只考虑 \(t = 1\)

此时变换为 \((i, j, 0)\to (-j + x, i + y, 1), (i, j, 1)\to (-j - 1 + x, i + y, 0)\)

因为 \(k = 0\) 后一定是 \(k = 1\) 然后又是 \(k = 0\),所以把 \((i, j, 0)\)\((-j + x, i + y, 1)\) 绑定到一起,就只需要考虑 \((i, j, 0)\to (-j + x, i + y, 1)\to (-i - 1 + x - y, -j + x + y, 0)\) 所形成的等价类。

依然尝试再变换一次:\((i, j, 0)\to (-i - 1 + x - y, -j + x + y, 0)\to (-(-i - 1 + x - y), -(-j + x + y, 0) + x + y, 0) = (i, j, 0)\),又回到了原点。

所以大部分的等价类依然是两个元素,只需要单独处理一个元素的等价类。
需要满足 \(2i\equiv x - y - 1\pmod n, 2j \equiv x + y\pmod n\)

\(n\bmod 2 = 1\) 时与 \(t = 2\) 时一样,因为存在 \(2\) 的逆元,只会唯一对应到一组 \((i, j)\),等价类数为 \(\frac{n^2 + 1}{2}\)
\(n\bmod 2 = 0\) 时因为 \(x - y - 1\not \equiv x + y\pmod 2\),所以一定不存在 \((i, j)\),等价类数为 \(\frac{n^2}{2}\)

时间复杂度 \(\mathcal{O}(d^2(n) + d(n)\log n)\)\(\log n\) 是快速幂的复杂度)。

submission

\(t = 1/2/3\) 因为结论很简洁都是可以直接打表得到的。
代码中提供了打表程序,trans(t, x, y) 会返回一个函数,其会返回 \((i, j, k)\) 经过变换后的新位置,调用 getcnt(trans(t, x, y)) 可以知道 \((t, x, y)\) 的等价类数。

M. Reduction and Growth

独立开每个质数 \(p\),考虑指数的加减法。

对于询问的 \((p^e, u_i, v_i)\)\(e\) 会减去 \(u_i\to v_i\) 路径上所有指数,最后与 \(0\)\(\max\)

于是可以离线建树,对于单点加查链和改为子树加单点值,就可以在 \(\mathcal{O}(\log n)\) 的复杂度下处理好一组 \((p^e, u_i, v_i)\)

对于 \(a_i\),只有 \(p \mid a_i\)\(p^e\) 是有用的,所以一个 \(a_i\) 至多拆出 \(\mathcal{O}(\log V)\)\(p^e\),总的就只有 \(\mathcal{O}(n\log V)\)\((p^e, u_i, v_i)\)

最后复杂度为 \(\mathcal{O}(n\log n\log V)\)

做这题的时候🐖了写了个关于 \(p\) 的根号分治,复杂度是 \(\mathcal{O}(n\frac{\sqrt{V}}{\ln V} + n\log n)\) 的。

submission

posted @ 2026-05-20 11:35  rizynvu  阅读(34)  评论(0)    收藏  举报