20260226 ICPC 总结

我讨厌 ICPC。

A - Sieve of Erato67henes

注意到 \(67\) 是素数,于是题目就变成了判断是否存在 \(a_i = 67\)。

B - Parkour Design

先将纵坐标调整至终点状态,只需要使用一种走法。设当前状态下横坐标为 \(x_0\)。

若 \(x_0 > x\) 或 \(3 \nmid (x-x_0)\) 则无解,否则可用若干次 \((x+3,y)\) 走法使达到目标。

C - Heapify 1

由于交换时每组 \(x,2x,4x,8x,\dots\) 下标的点是互不相干的,又因为冒泡排序也利用了交换,也就是可以理解为交换就能让每一组数升序。于是枚举每一组数并分别将其升序排序,最后还原数组判断整体是否升序即可。

D - Dice Roll Sequence

考虑 DP,定义 \(dp_{i,j}\) 表示当前考虑到第 \(i\) 个数且 \(a'_i = j\) 状态下最少需要的修改次数。转移时枚举 \(i,j\) 及 \(a'_{i-1}\) 的值 \(k\)(务必满足 \(j+k \not= 7\) 且 \(j \not= k\)),若 \(j=a_i\) 则 \(dp_{i,j} = dp_{i-1,k}\) 否则 \(dp_{i,j} = dp_{i-1,k} + 1\)。最终答案即为 \(\min_{1 \le k \le 6} dp_{n,k}\)。

E - ABAB Construction

根据字符串 \(T\) 的排列方式,我们不难得知以下两条性质:

  1. 若 \(n\) 为奇数,则后续构造得到的 \(S\) 的第一个字母一定为 \(\text{a}\)。
  2. 若 \(n\) 为偶数,则后续构造得到的 \(S\) 的前两个字母一定不同。

那么我们就可以根据 \(n\) 的奇偶性先做一个初步的判断。

但是这还没有完。我们发现第 \(2\) 条性质可以延伸为:取后续构造得到的 \(S\) 的后 \(m\) 个字母,其中 \(m\) 为偶数,则这些字母中的前两个字母一定不同。

于是不断取偶数长度的后缀取判断前两个字母是否不同即可。

F - Absolute Cinema

我们使出推式子大法——

首先,显然有

\[f_x = (x-1)a_1 + (x-2)a_2 + \dots + 2a_{x-2} + a_{x-1} + a_{x+1} + 2a_{x+2} + \dots + (n-1-x)a_{n-1} + (n-x)a_n \]

则可得

\[f_x - f_{x+1} = (a_{x+1} + a_{x+2} + \dots + a_n) - (a_1 + a_2 + \dots + a_x) \]

记 \(s_x = f_x - f_{x+1}\)。

我们又能发现

\[s_{x-1} - s_x = (a_{x} + a_{x+1} + \dots + a_n - a_1 + a_2 + \dots + a_{x-1} ) - (a_{x+1} + a_{x+2} + \dots + a_n) - (a_1 + a_2 + \dots + a_x) = 2a_x \]

这样就能得到 \(a_i(1 < i < n)\) 的值啦!最后再将数据分别代入 \(f_n\) 和 \(f_1\) 就能算出 \(a_1\) 和 \(a_n\) 了。

G - Lost Civilization (Easy Version)

我们每次只需记录一个起始段 \(st\) 的位置——当然,所有被记录的 \(st\) 都是初始时必须存在的数,也就是说,记录了多少不同的 \(st\),题目所求答案就是多少。

最初,\(st=1\),答案 \(cnt=1\)。

循环遍历 \(i \in [2,n]\),若 \(a_i \le a_{st}\)(当前段没有比 \(a_{st}\) 更小的数值来创造新的一个不超过 \(a_{st}\) 的值了)或者 \(a_i \ge a_{i-1} + 2\)(差距太大,无法从上一个数推导),此时就需要产生新的 \(st\),让 \(st = i\) 并 \(cnt \gets cnt+1\) 即可。

吃了不画图、不手玩样例的亏。

令 \(f_u\) 为从节点 \(u\) 出发,到达 \(fa_u\)(即 \(u\) 的父节点)所需最小秒数。随便画图模拟一下这个什么“笨蛋优先搜索”的过程就可以知道,\(f_u = 2 sz_u + 1\),其中那个 \(sz_u\) 表示以 \(u\) 为根的子树大小(不包含节点 \(u\) 本身)。

再考虑答案 \(ans_u\),依旧手玩样例,可得 \(ans_u = f_u + f_{fa_u} + f_{fa_{fa_u}} + \dots + f_1\)。这个可以跑一次 DFS 得到,于是整个题目就做完了。

哦对了,记得取模。

I - Recollect Numbers

不难得出游戏进行次数的上下界:至少需要 \(n\) 个回合,至多只能有 \(2n-1\) 个回合。如果 \(k\) 不在这个范围内就直接返回 NO。

否则,先构造一组 \(n\) 个回合的排列方式 \(a\)(即不降排列),然后再根据 \(n-k\) 的大小交换若干个 \(a_{2i-1}\) 和 \(a_{2i+1}\) 的值,这样就可以使游戏过程中“浪费”一个回合。最后把 \(a\) 输出就结束了。

J - Lost Civilization (Hard Version)

本质上,\(f(b)\) 的值就是,每个前面没有 \(b_i-1\) 的 \(b_i\) 的个数。

直接枚举每个子段 \(O(n^2)\) 会超时,换个方向去思考,计算每个 \(a_i\) 对答案的贡献。

对于一个 \(a_i\),若其对子段 \(a_{l \sim r}(i \in [l,r])\) 有 \(1\) 的贡献,则当且仅当该子段中不包含 \(a_i\) 左侧最近的值为 \(a_i - 1\) 的元素。

设 \(p_i\) 为 \(i\) 左侧最近的满足 \(a_{p_i} = a_i - 1\) 的下标(若不存在则 \(p_i = 0\))。为使 \(a_i\) 成为新段的起点(即其对答案存在贡献),左端点 \(l\) 必须满足 \(p_i < l \le i\),右端点 \(r\) 则可以为任意 \(i \le r < n\),故 \(a_i\) 对答案的贡献为 \((i-p_i)(n-i+1)\)。

实现上,我们枚举 \(i \in [1,n]\),不断沿着原先就求好的 \(p\) 往前寻找(毕竟你不能虚空找,中途需要有值衔接)求出其对应 \(p_i\),然后对应计算其对答案的功能贡献即可。记得开 long long。

K - Parabola Independence

考虑二次函数 \(f_1(x) = a_1 x^2 + b_1 x^2 + c_1\) 和 \(f_2(x) = a_2 x^2 + b_2 x^2 + c_2\),若这两个二次函数在图像上无交点,则当且仅当 \(f_{\Delta}(x) = (a_1 - a_2) x^2 + (b_1 - b_2) x^2 + (c_1 - c_2)\) 函数无解。这个是好判的:求出该函数的 \(\Delta\),若 \(\Delta \ge 0\) 且 \(a_1 \not= a_2\),或者 \(a_1 = a_2\) 且 \(b_1 \not= b_2\),则有解;否则一定无解。

对于无交点的两个函数 \(f_1(x)\) 和 \(f_2(x)\),一定可以比较出两函数的严格大小关系。注意到取任意一点 \(x\) 均可判断,故考虑取 \(x=0\),直接根据 \(c\) 的大小关系判断即可。易证一定不存在无交点但 \(c_1 = c_2\) 的两个函数。

得到严格大小关系后,我们就可以建图了,注意是一张有向图。在图上从每个点 \(i\) 出发跑最长链,还得建反图,毕竟正着反着都得跑一遍(因为题目要求是包含函数 \(i\),并没说其必须得是最大或者最小什么的),得到的两条最长链长度之和 \(-1\)(之所以要 \(-1\) 是因为函数 \(i\) 在两条链中都被算了一次)便是答案。

记得开 long long 喔。

Summary

E I 没想到很可惜;
J 的思路确实挺巧,算是学到一个新 trick;
K 需要一定数学基础,不过整体不算难。

继续加油。嘎嘎嘎 /fendou

posted @ 2026-02-27 12:30  嘎嘎喵  阅读(73)  评论(0)    收藏  举报