传送门：洛谷 CF2218E The 67th XOR Problem | Codeforces E. The 67th XOR Problem 更佳的阅读体验：CF2218E 题解简要题意：给你一个数组，每次操作可以选择其中一个元素，将数组内所有元素都与它进行按位异或运算，然后将该元素删除，求 $n−1$ 次操作后剩下的最后一个元素可能的最大值。$\sum n \le 3105$。诈骗题。来推个柿子吧！假如现在我们有一个 $n = 5$ 的数组 $\{ a_1, a_2, a_3, a_4, a_5 \}$，我们选中第一项进行一次操作，数组就变成了：$$ \{ a_2 \oplus a_1, a_3 \oplus a_1, a_4 \oplus a_1, a_5 \oplus a_1 \} $$那如果再对现在的第一次进行一次操作呢？现在数组就变成了：$$ \{ (a_3 \oplus a_1) \oplus (a_2 \oplus a_1), (a_4 \oplus a_1) \oplus (a_2 \oplus a_1), (a_5 \oplus a_1) \oplus (a_2 \oplus a_1) \} $$我们知道，异或运算有一个很重要的性质是 $x \oplus x = 0$，同时也满足结合律。因此，现在的每一项都异或了两次 $a_1$，其实 $a_1$ 就被消掉了，现在的数组就变成：$$ \{ a_3 \oplus a_2, a_4 \oplus a_2, a_5 \oplus a_2 \} $$我们发现第一次操作中选中的 $a_1$ 已经不存在了。如果我们一直选择序列中的第一项进行操作，最后剩下的一个元素就是 $a_5 \oplus a_4$，也就是，最后一个未被选中的数与最后一次被选中的数的异或值。因此，我们只需要确定这两个数，就可以得到最后剩下的一个数的值。因为 $n$ 非常小，我们可以直接枚举任意两个元素的异或值，求最大值即可。单组数据时间复杂度 $O(n^2)$。#include <iostream> using namespace std; const int N = 3110; int t, n, a[N], ans; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); for (cin >> t; t; --t) { ans = 0; cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) ans = max(ans, a[i] ^ a[j]); cout << ans << '\n'; } return 0; }
我被囚禁在了一个固步自封的囚笼中。他们说，我是安全的。我沉浸在那里，沉沦在那里。我在那里挣扎着死去，在一个悄无声息的角落，偷偷地，默默地。尽管，我是安全的。$\texttt{Written on 2026.4.7.}$
传送门：洛谷 CF2209C Find the Zero | Codeforces C. Find the Zero更佳的阅读体验：CF2209C 题解简要题意：IO 交互题。有一个长度 $2n$ 的隐藏数组，其中包含 $1 \sim n$ 各一个，以及 $n$ 个 $0$。每次询问可以查询两个位置的元素是否相等，你需要在不超过 $n + 1$ 次询问中找出一个值为 $0$ 的位置。因为 $1 \sim n$ 的每个数都是出现且仅出现一次，所以如果某次询问得到了 $a_i = a_j$ 的结果，说明这两个都是 $0$，选一个输出即可。如果 $a_i \ne a_j$，说明它们最多只有一个数是 $0$。如果我们直接排除掉这两个数，继续去考虑接下来的数，我们发现还剩下至少 $n - 1$ 个 $0$。那么我们每次都对两个未询问过的位置进行询问，经过 $n - 1$ 次询问后，如果仍然没有得到 $a_i = a_j$ 的反馈，我们就剩下了最后两个数。如果这两个数也不相等呢？那就只剩下一次询问了，无法确定 $0$ 的位置。但如果将目光向前看呢？我们随便找一对之前被我们询问过的位置，加上最后剩下的两个数，我们发现这四个数里至少包含两个 $0$。现在我们剩下两次询问，此时问题就简单许多了。假设我们还没询问过的两个数是 $x, y$，从之前的询问中拿出来的两个数是 $a, b$。因为之前已经询问过 $a$ 和 $b$，所以此时就一定有 $a \ne b$。那如果我们抓住 $x$ 一个数，和 $a, b$ 分别比较，那就只有两种情况了。如果 $x = a$ 或 $x = b$，那么显然 $x$ 一定是 $0$，直接输出即可。否则，未参与比较的 $y$ 就一定是 $0$。#include <iostream> using namespace std; int t, n, stat; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); for (cin >> t; t; --t) { cin >> n; for (int i = 1; i < n; ++i) { cout << "? " << (i << 1) - 1 << ' ' << (i << 1) << '\n'; cout.flush(); cin >> stat; if (stat) { cout << "! " << (i << 1) << '\n'; cout.flush(); break; } } if (stat) continue; for (int i = 2; i <= 3; ++i) { cout << "? " << (n << 1) << ' ' << (n << 1) - i << '\n'; cout.flush(); cin >> stat; if (stat) { cout << "! " << (n << 1) << '\n'; cout.flush(); break; } } if (!stat) { cout << "! " << (n << 1) - 1 << '\n'; cout.flush(); } } return 0; }
传送门：洛谷 CF2194C Secret message | Codeforces C. Secret message更佳的阅读体验：CF2194C 题解简要题意：给你 $k$ 个长度为 $n$ 的字符串，你需要构造一个新字符串，使得每个字符都与至少一个给定字符串的相同位置的字符相同，并最小化该字符串的最小循环节长度。首先来考虑如何处理循环节的长度。既然构造出来的字符串是由几个字符串循环而来的，那也就是说，最小循环节一定是 $n$ 的约数。因此，我们可以先找出 $n$ 的所有约数，从小到大挨个枚举是否合法。如何判断一个最小循环节长度 $d$ 是否合法呢？我们需要构造一个长度为 $d$ 的模式串 $t$，使得整个答案字符串由 $t$ 重复 $\dfrac{n}{d}$ 次组成。也就是说，$t$ 中的每一个位置，所选的字符都必须同时存在于给定字符串中对应的位置上。也就是说，对于一个位置 $1 \le i \le d$，所选字符必须同时存在于给定字符串的 $i, i + d, i + 2d, \cdots, i + \left ( \dfrac{n}{d} - 1 \right ) d$ 的位置上。因为给定字符串只有小写字母的 $26$ 个字符，为了方便处理，我们对字符串进行状态压缩，$mask_i$ 存储位置 $i$ 可以使用的字符集。此时，$t_i$ 可用的字符集就一定是 $mask_i, mask_{i + d}, mask_{i + 2d}, \cdots, mask_{i + \left ( \frac{n}{d} - 1 \right ) d}$ 的交集。如果这个交集为空，意味着当前的这个 $d$ 不合法，我们直接尝试枚举下一个 $d$。如果交集全都不为空，那么就可以直接构造答案。我们使用 __builtin_ctz 函数来获取一个数从最低位开始 $0$ 的个数，得到可用的字符，构造字符串即可。单组数据时间复杂度 $O \left (nk + n \cdot d(n) \right )$，其中 $d(n)$ 表示 $n$ 的约数个数。#include <iostream> using namespace std; const int N = 5e4 + 10; int t, n, k, mask[N]; string s[N], ans; vector<int> v; bool flag; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); for (cin >> t; t; --t) { v.clear(); fill(mask + 1, mask + n + 1, 0); cin >> n >> k; for (int i = 1; i <= k; ++i) { cin >> s[i]; for (int j = 1; j <= n; ++j) mask[j] |= (1 << s[i][j - 1] - 'a'); } for (int i = 1; i <= n; ++i) if (!(n % i)) v.push_back(i); for (auto d : v) { flag = false; ans.clear(); for (int i = 1; i <= d; ++i) { int tmp = mask[i]; for (int j = i + d; j <= n; j += d) tmp &= mask[j]; ans.push_back(__builtin_ctz(tmp) + 'a'); if (!tmp) { flag = true; break; } } if (!flag) { for (int i = d; i <= n; i += d) cout << ans; cout << '\n'; break; } } } return 0; }
我害怕变得冷漠。我害怕会让我身边的人，因为我哪怕一刹那的冷漠，而遭受更多的本可以因我而不必遭受的痛苦。我开始学着如何帮助更多的人。但也因此，我逐渐发现我能帮到的永远只是相比起来没那么痛苦的人。他们的痛苦太深重了，以至于我只能沉沦于无尽的共情与情绪闪回中，无法自拔。我什么都说不出来，只好生硬地重复着那些聊胜于无的安慰。我想救救他们。我想，救救过去的自己。对不起。$\texttt{Written on 2026.1.29.}$
传送门：P1330 封锁阳光大学 更佳的阅读体验：洛谷 P1330 题解阅读本文前，请确保你已经对二分图有所了解。简要题意：给你一张无向图，求最少选取的节点数量，使得节点之间两两不相邻，且每条边都连接着一个选中节点。观察给出的条件，发现每个点只有“选”或“不选”两种对立的状态，并且相邻节点的状态必须是不同的。由此我们想到，本题事实上是要求我们判断给定图是否为二分图，因此可以直接染色。如果染色过程中发现了冲突，说明给定图不是二分图，不论如何也无法得到任何一种合法的方案，此时直接输出 $\texttt{Impossible}$ 并退出程序即可。染色结束后，我们取两种颜色中较少的节点数作为答案即可。你兴高采烈地写出了一份朴素的二分图染色，然后得到了 50 分的好成绩。此时你发现，题目给出的限制中，只保证了给定图是一张无向图，而非无向连通图。这样的话，我们就应当对每个连通块进行讨论了。对于每个连通块，我们仍然取两种颜色中较少的节点数，答案即为每个连通块的答案之和。时间复杂度 $O(n + m)$。#include <iostream> #include <algorithm> using namespace std; const int N = 1e4 + 10; int n, m, u, v, col[N], cnt[2], ans; basic_string<int> g[N]; void dfs(int u, int c) { col[u] = c, ++cnt[c]; for (auto v : g[u]) { if (col[v] != -1) { if (col[v] == col[u]) { cout << "Impossible\n"; exit(0); } continue; } dfs(v, c ^ 1); } } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1; i <= m; ++i) { cin >> u >> v; g[u] += v, g[v] += u; } fill(col + 1, col + n + 1, -1); for (int i = 1; i <= n; ++i) if (col[i] == -1) { cnt[0] = cnt[1] = 0; dfs(i, 0); ans += min(cnt[0], cnt[1]); } cout << ans << '\n'; return 0; }
本文同步发表在洛谷专栏，你也可以点击这里以获得更佳的阅读体验。8.11终于联系上学校分管算法竞赛的老师了。但是他说学校的选手水平太弱，已经五六年没有搞过 ICPC / CCPC 了，只是每年打一场 NMCPC。以及表示学院不会报销。最开始刚加上的时候，老师给我发的是大长条语音，说话挺慢的，而且说话带比较重的本地口音。加上和我说的这些内容，一度让我感觉他不支持我打比赛，也完全不想管这事。甚至可能是因为这事，我一个多月没发作过的焦虑又犯了。那会正好在外面，没带抗焦虑的药物，就只能自己一个人硬扛过去了。手抖到我连手机都拿不稳，想求助也好像没有人可以求助。还是硬着头皮继续聊下去了。以及提出了自费比赛，这会他才愿意帮我报名。尝试联系了一下往届的选手，发现甚至只有两位不是开学大四。这就可以引出下一天的故事了。8.12凑不齐三个人。全剧终。哎好吧上面这个结尾是我故意这么写的。是不是叫什么，奥利奥式结尾。找不到队友确实是真，学校不给报销也确实是真，但是我真的觉得这样写很好笑啊。提出自费比赛以后，感觉老师的态度改变了点。不知道是因为我已经习惯 / 接受了还是真的有变化。至于比赛，能报的我全报了。其实也没抱着拿奖的希望去，我清楚我现在的水平离拿牌子还挺远的。但感觉还是，不打不行。哪怕是自费体验一次，我也要打。大出血了。可能还要准备一千多块钱的往返机票，以及一天的酒店。还有剩下三场网络赛的报名费。其实我也不知道自己为什么对算法竞赛有这么深的执念。曾经在 NOI 之前就是这样。哪怕明知道自己的水平已经完全没可能拿牌子，但还是坚持训练到了 NOI。甚至已经有老师建议过我，大一上学期应该把重心放在学校的课程上。我也确实清楚对于这个学期，学校的课程的成绩才是对我至关重要的。我好像，没办法说服自己，甘于平庸。哪怕只能开出一个签到题，我也想留下我的足迹。好吧，对于这么一位本来就平庸的弱者。谈这些想法和行为，是不是只会显得我很可笑？我不得而知。扯远了。其实是找到 1.5 位队友的，尽管他们都水平有限就是了。至于为什么说是 1.5 位，是因为九月一共 4 场比赛，有一位只参加后面两场。晚上 vp 了一下 JSCPC / GDCPC 2025。出于练习英语读题能力的考量，全程没看中文题面，只是偶尔查了几个不认识的词。好吧读题速度真的远低于中文题面。一个小时开出来了两道签到题，然后接下来的两个小时就没有任何进展了。这会已经凌晨一点了，不想打了。不过我罚时挺低的，看了一下榜，哪怕后面两个小时也开不出来新的题，也能铜尾了。不过如果按这个水平，哪怕是邀请赛也应该比较难拿牌子了吧。决定明天再 vp 一场邀请赛看看感觉怎么样。晚安。8.19今天下午和队友 vp 了东北邀请赛，也是我第一次完整地 vp 五个小时。说是和队友 vp，其实所有题也都是我自己开的。至于组队，有点用，但不多。1.8 小时后就没有任何进展了，也就是我自己开完了几道签到题以后。接下来的三个小时都在死磕 A，其实中间有和他有一些交流，但大部分内容都只是单纯地让我血压暴涨，包括一些错误结论和非常基础的问题，比如 long long 能不能存得下 1e15。其实我知道水平较低不是他的错，我也是从那个时候过来的，所以我始终在尝试压制一些负面的情绪。只是继续一个人闷头想题去了。今天这次 vp 以后也大概算是吃了定心丸吧，悬着的心终于死了。不过赛后看题解，发现离正解只差一点点了。但是三个小时一直没开出来，直接从上位银牌区掉到上位铁牌区。这么看来，似乎也不该向另外一位队友抱有太大希望了。不管了，先加训吧。8.20看到教练群里的消息，突然意识到网络赛是需要先缴费的。赶紧联系教练先把参赛费用缴了。余额 -= 200。以及南昌邀请赛群里的一件趣事。哪有大一省队爷。8.24突然想起来去查了一下，发现低价机票已经卖得差不多了。赶紧联系队友买票订酒店。队友预算不太够，对于酒店的态度是能住就行，于是我被迫选了一家快捷酒店。打完南昌第二天还要赶早班机回内蒙，因为下午还要打网络赛。本来有一班国航的飞机，但是好像取消了，现在只剩下一班南航的飞机了。轻薄座椅 + 早班机 + 不能进休息室，我都不敢想那天早上我的怨气得有多重。8.25CCPC 网络赛可以报名了，虽然怎么总感觉报名费在骂人。余额 -= 250。晚上发生了个挺烦的事。班级群里有个学长，说是请假需要先和他说。然后我就加他了，并且给他发了比赛的日程，我承认九月份的比赛确实有点多。问他说能不能请假去比赛，他说应该不能。军训也是修学分，时间不够我就得重修。14 天每天都去才算时间修够了。那我崩溃了啊，不是说可以临时请假吗，怎么又来这一出。之前看校历上也没写周末军训（军训那段时间的周一到周五是灰色的，周末是和其它时候一样的白色），为什么突然又变成周末也要军训了。如果我周末不军训的话，我打比赛最多只耽误两天军训。但如果周末军训就要耽误六天了。每天都要训，除非我开医院的证明，具体还要看学院那边认不认可我的病，只有开学以后联系负责军训事务的老师才能知道了。然后我又焦虑发作了。群友说学长不可信。然后我又去学院的大群里 @ 了负责答疑的老师。我没提比赛的事，但他说有病历如果发病了可以请假，虽然会影响成绩。能合法地中途离开就行。但还是难受了好长时间，可能又过了一个多小时才平复。8.26正好今天去医院，证明开下来了。但不知道为什么今天一整天都特别烦。9.2最近精神状态一直很差，游记就鸽了。从这里开始接下来几天的内容都是 9.10 才补的。今天刷朋友圈的时候和朋友互动，才知道原来新生打网络赛是需要学院 / 学校盖章的在校证明的，因为还没有学生证。还好提前问了一嘴，不然网络赛就寄了。哎哎弱省弱校。以及，让我们在此感谢 muxi 女士的耐心解答，以及救命之恩。9.5其实录取通知书上写的报到日期是明天，但是收到小道消息说今天下午就可以报到了，于是决定先去报到。不搬行李，单纯想先去踩踩点（）。以及比报到重要得多的在校证明。学校好大，走了十分钟才到学院的办公楼，到了以后发现学工办没人，隔壁的老师让我去报到的地方找。破防了，我又得走回去。学工办的老师跟我说，加上微信把信息发给他，明天去找他取。那也行吧，反正后天才比赛。在校证明搞定了（吗？），接下来是讨论比赛场地和志愿者。对于场地，因为是周末，学校机房不开门。我提出去酒店，但队友认为没必要花钱，于是这个问题暂时搁置了。对于志愿者，我找了几个小时，没找到有空的熟人，大家都好忙（哭哭）。实在没办法了，决定把教练摇过来当志愿者。这样一来场地问题也解决了，可以直接用学校机房了。呜呜对不起教练让您周末又加了五个小时班。9.6今天是正式的报到日。本来打算早点起的但是一觉睡醒又中午了。下午往宿舍里搬东西，折腾了很长时间，一直到晚上才勉强收拾好。突然想起来 XCPC 赛事可以带纸质资料，于是紧急整理各种代码板子和公式，虽然最后也没整理多少。终于赶在十一点宿舍锁门之前写完了。赶紧下楼，发现楼下打印店下班了。作罢，回宿舍睡觉。以及熄灯之后看手机真的好难受。紧急下单了一个台灯和一个夜灯。9.7今天是比赛日！上午去打印店打印纸质资料，才发现学校的打印店怎么这么黑，一页就收我两块钱。但是有点来不及出去打了，奢侈一次吧。想起来上次去医院，医生让我监测体重。中午回家取东西的时候顺便称了一下，发现体重正在稳定地以每周一公斤的速度缓慢下降。每天只吃一顿饭，并且一顿饭只吃几口的下场显现了。然后就去学校了。中午也一如既往地没吃东西，只是为了防止下午低血糖，去瑞幸买了个小蛋糕吃掉了。以及买了一杯冰美式防止犯困。教练说让我俩早点到，于是我们约定好了十二点半到机房。然后我们十二点半准时到了机房门口，然后一直等教练等到十二点五十。这也为接下来发生的故事埋下了伏笔。你可能会好奇为什么我只有一个队友。其实本来是有两个的，或者说，报名表上是有两个的。但是另外一位队友要去打数模，所以就不来了。其实还可以展开一些故事，但是挺高血压的，我不想回忆了。回到正题吧。因为进机房离开始比赛只有十分钟了，我就只能赶紧登录监考端以及架起手机了。监考相关的东西调试完成的时候，已经离开始比赛只有几十秒了，我就抓紧时间打开 VSCode 配置工作区了。比赛开始了，先做签到题。本来打算偷个懒，等有人过题我就直接去看那道题。然后发现好像和我 VP 的时候不一样，怎么一分钟了还没有人过签到题（）。发现签到题是 G，这就去写。然后发现机房电脑的 VSCode 没配置过 IntelliSence，导致我只要写代码，下面就会划上红色的波浪线。看着太难受了，于是我关掉 VSCode，痛苦地拿 Dev-C++ 写了五个小时代码。因为等了大概五六分钟才看到有人过签到题，和 Codeforces 上 VP 的完全不一样，这就导致我误以为签到题很难。看到那份排序代码，其实我想到拓扑排序了，但是以“肯定没那么简单”为原因否决了。我以为可能是一个类似「洛谷 P1347 排序」的东西，建图然后拓扑排序。心里还在小声嘀咕，怎么签到题就考拓扑排序，ICPC 这么难吗。然后按着这个思路写了大概四十多分钟，吃了三发罚时，太耻辱了。队友突然提醒我，因为一定有 $a_i < b_i$，所以是不是只要对于每个相邻位置都有至少一个 $a$ 和 $b$ 即可。然后这题过了。这个时候已经五十分钟了。发现 B 做的人也很多，但是看了一眼，好像需要一个神秘结论，猜不出来啊。为了不浪费时间，就直接去写 A 了，是一道小模拟。这次居然出乎意料地顺利，九十多行只写了不到一个小时，写完只调了一次就能过样例了，提交也是一遍就过。很爽啊！然后去看 B。要求从 $1 \sim n$ 中选 $k$ 个数，使得任意两个相邻元素之差和 $n$ 的 GCD 之和最小。于是想到 $1$ 和 $n$ 的 GCD 始终是 $1$，那是不是只要尝试让相邻两个元素相差 $1$ 即可，也就是输出 $1$ 到 $k$。不确定这个思路对不对，于是花十分钟时间打了个表。事实证明是对的，于是飞速过了这题。其实到这里就感觉这场的竞赛策略有点小问题了，哪怕 B 是一遍过的，在 A 后面才做也导致总罚时又多了不少。这个时候去看了一下榜，意外地发现我居然打到了内蒙第一。这个时候全内蒙只有我一个队过了三道题，并且排名比内大的铜牌队还高啊。当然我知道这应该是他们队这次发挥失常，但不影响这太爽了！然后我的一种神秘的胜负欲就燃起来了。发现 D、I、M 过的人都差不多，于是挨个看了一遍。D 感觉有点难，I 和 M 都像最短路，但感觉 I 更简单一点？于是开始做 I。大概估算了一下复杂度，感觉可以试试暴力一点的做法，能不能比较极限地卡过去？当然，我失败了（笑）。于是开始考虑 Dijkstra 相关的做法。最大的问题就是，背包数和剩余空间这两个参数都很重要，应该怎么写排序规则。乱搞了一下，发现只考虑任意一个都没办法做，就开始想一些，歪门邪道之类的。我一直都是用 pair 来写 Dijkstra 的，那或许，我往里边塞一个结构体也可以？感觉挺对的。然后大概就开始实现这个想法了，大概反反复复写了二三十分钟吧，终于赶在封榜之前写出来了。居然直接就过样例了，果断提交。评测的时候还卡了一下，然后我就退出去了，直接去提交记录里看。因为 PTA 的评测状态的颜色特别反人类啊，WA 是绿色，AC 是红色，一开始我还愣了一下，以为又没过。仔细看了一眼，确实是 AC，又确认了一下题目，确实是 I 题。好耶！居然过了！这次是真的欣喜若狂，我提交的时候真的是心里完全没底的。又看了一眼榜，仍然稳居内蒙第一啊！接下来的一个小时一直在写 M，但是哪怕到最后也没调出来。比赛结束了。至少拼到了最后一刻吧，总之不会后悔。接下来就是满怀期待地打开最终的榜单了！全国排名是一千出头，和我猜的差距不大。然后看省内排名，仍然内蒙第一啊！甚至领先第二名两百多名。比较意外的是内大二队在封榜的最后一个小时里过了两题，直接超过一队变成第二了。虽然四题罚时有一千多（）。赛后和群友交流，发现我的 M 题的思路完全没问题。有点可惜。不过还是很爽啊！赛后的好几个小时里，心情都超级好，以及一直在和朋友分享这个喜讯。好吧，我承认一千多名没什么可骄傲的，我的水平还是相当低，离我退役前的水平也还挺远的。不过在比赛前一个月我才刚刚开始复健算法竞赛，刚刚捡回一点点基础就来打网络赛，完全不是我预期的那样，被内大爆踩，甚至在我的第一场 XCPC 比赛就又拿回了内蒙第一的位置，我真的非常满意啊。已经很久没有这么发自内心地为自己而开心过了。一个比较有趣的事是，今天的唯一败笔是晚上打车的时候遇到一位对路况不熟悉的司机（），十几公里的快速路硬是错过了三个入口，全程在桥下面堵着，二十分钟的路走了五十分钟。晚上决定奢侈一次，去万象城吃点好吃的奖励一下自己。果然开心的时候食欲也变得很好。吃完就回学校准备去取我的灯，发现驿站下班了。破防了，现在是唯二的败笔了（）。晚上睡不着，在床上又想到了点难受的事，可能确实是今天太累了吧，一整天只吃了一顿晚饭，加上下午高强度地打了五个小时比赛。总之，算是给我的 XCPC 生涯开了个好头吧。希望接下来也可以像今天一样顺利！9.8今天下午参加了学院的开学典礼，以及什么所谓的，新生教育。三个多小时，叽里咕噜说了一大堆，没啥有用的。只不过到后面讲了一些军训的内容，包括一些规定。比如军训缺勤三天就直接挂科，包括病假，哪怕请病假也必须去现场坐着。语气非常强硬啊，讲的各种后果特别严重之类的。这个时候我就又情绪崩溃了。那我接下来的比赛怎么办，不是最开始说的是特殊情况可以请假吗。哪怕不能通过比赛请假，我有医院盖章的病历证明也不行了吗。而且如果真的让我连着训十四天，以我现在的体力也显然不可能跟得上。这就给我本来就非常差的精神状态继续雪上加霜了。不想回宿舍，我自己出去待了会，顺便跟班主任讨论了一下。很幸运的是班主任很理解我啊，也很支持我，他说明天再帮我问一下，应该还挺有希望的。差不多就这些吧。今天也是一如既往地睡不着，不过因为有下午的开学典礼的 debuff，确实比前几天难受了不少。9.9今天是军训第一天，累累累累累。比较奇怪的是，我感觉精神上比生理上更累，但我不知道为什么。其实上午结束以后我的体力已经基本上到极限了，但感觉还能撑撑，于是又撑了一个下午和一个晚上。尽管下午军训的过程中抑郁发作了，但还是撑下来了。我一个人在队列里偷偷哭，没让任何人发现。今天也是早上和中午都只吃了几口东西。这么大的强度，我居然没有一点低血糖的症状，这还挺好的。不过从下午四五点开始，我的怨气就开始逐渐大起来了。晚上结束以后实在太难受，不想回宿舍，于是又出去找朋友待了一会，至少可以精神上不那么累了吧。9.10军训第二天。依旧晚上没睡好。感觉很奇怪，今天胸口陆陆续续疼了一整天。上午实在撑不住了，最后一个小时甚至直接去病号连歇着去了。然后就又听到了开学典礼时候的那位老师的新的逆天言论。希望等你行将就木的时候你也可以不听医生的话哈。下午请假了，直接去医院。突然意识到，网络赛的 I 题好像难度不小。和几位朋友确认了一下，确实有绿题难度。那这就是我第一次在正式比赛中切掉绿题！重大里程碑！9.12 - 10.23现在是 11 月 6 日，突然意识到快两个月没更新了。这中间发生了好多事情，我应该是不打算补了，在这里大概概括一下吧。这部分和接下来几天的内容都是 11 月 6 日补的。九月中旬去打了 CCPC 南昌邀请赛，不出意外地打铁了。不过居然就差一题就铜了，我还挺惊喜的。当然了，因为有队友在，我这次出去比赛的体验不怎么好，包括交通，住宿，赛时体验等等。接下来就是两场网络赛，但是我自认为这两场的题都挺史的，反正打得不舒服，成绩也远没有第一场的好。网络赛之后的接下来一段时间内，除非打星，否则我不会有队友了。出于一些神秘原因，我一直在带我高中的选手们。我也不知道能不能说“带”，我只有高二一年经常去给大家讲课，剩下的时间一直都在做一些幕后工作，比如出比赛题或者和教练讨论训练方案之类的。不论如何，今年已经是第四届了。众所周知地，这个时候已经快要 CSP-J/S 初赛了，我也要忙起来了。包括组各种模拟赛之类的，总之是为了让大家适应赛时的环境，以及题目难度，避免赛时碰到一个完全陌生的环境下直接心态崩溃。因为我校的选手们水平不算高，为了让大家学会打暴力，我在每一场模拟赛的题解里都把每道题的每一个 Subtask 的题解和代码全写了一遍。当然了，这就导致我的工作量非常巨大，接下来基本上每周都要写一份上万字的题解，包括十几份代码，以及其他一些有关训练的事务，包括有时候需要维护一下我校的 OJ 之类的。这种高强度的工作，加上学校的课程也不能落下，直接导致了我在十月底突然爆发腱鞘炎，手腕疼得要死，不过还好这会已经快要复赛了。其实这期间还参加了 CCSP，不过这个不属于 XCPC，就不提了。不过有一个很巧的事是，发现扶苏老师也来打了 CCSP，甚至就坐在我前面。不过最后还是没敢上去和她打招呼。这期间还接到了一个非常重大的神秘任务。不过既然说是神秘任务，当然是一些不方便在这里讲的东西（坏笑）。之前我一直都只是在抱着能不能申到一个外卡的心态，显然没什么赛站愿意给我发外卡。大概十月中旬的时候吧，有朋友突然提醒了我，其实也可以打星参赛！我从来没想过我今年就可以拿牌子，但可能是出于某种执念，我就是很想打比赛。这样的话，其实是否正式参赛，对我来说已经不重要了。意识到这个问题的时候其实已经有点晚了，很多赛站都已经报名结束了，我赶紧在还没截止的赛站里提交了打星的报名。很幸运的是，申到了 ICPC 武汉站和 CCPC 重庆站的打星。以及沈阳站的群里有老师发了一个辽宁省赛的邀请函，接受外省高校报名。感觉省赛的强度应该不会很高，说不定还有机会拿个牌子，于是就报名了。这样一来，我十一月的日程就被安排得非常满——我需要在五个周末打四场比赛。有点高强度，但是至少有比赛打了。不过报名费加上机票酒店，也确实花了不少钱。机票酒店的支付信息太零散了，只放一个报名费好了。反正挺心疼的。10.31我周五下午没课，所以我的周末有两天半（开心）。中午下课以后就直奔机场，去打武汉站！不过下午没有直飞武汉的航班，需要去郑州转一下。值机的时候发现白塔机场居然换登机牌了，新登机牌好好看！这次顺便约了两位关系非常棒的高中的好朋友在武汉见面，一位在香港的和一位在无锡的，武汉就离他们很近了（至少比内蒙近多了吧）。今年我没办法在现场给大家讲比赛时候的注意事项了，只能写一份文档给大家了。当然，被我一直拖到了今天，终于还是在高铁上写完了。不过写完以后意识到，好像确实有很多人也在面临着类似的问题，于是我就稍微改了一下发到洛谷上了。现在是这篇，我想到了可能反响会很好，但确实没想到会这么好，只花了一个多小时就冲到了文章广场榜首，热度直逼我六月份写的那篇有关高考的文章，甚至被 LCA 翻牌子了。当然，如果你没读过的话，我也建议你去读一下。终于又来到这个红绿灯可以挑个自己喜欢的颜色走的城市了！在路上一直折腾到快七点，然后与好朋友顺利会师！聊了很多，反正感觉已经很久没有说过这么多话了，这种感觉好棒。意识到武汉可以喝到茶颜悦色，遂。北方孩子馋哭了。以及，打车回酒店。我们聊到很晚，然后我就回房间睡觉了。11.1今天是热身赛日！又和他们玩了一上午，下午就去签到和打热身赛了。进学校的那一刻起，我就知道这个武汉站我来对了。从校门口一直到签到处，街边的路灯上全都挂着“ICPC 国际大学生程序设计竞赛亚洲区域赛（武汉）”的旗子。排场非常大啊，这是九月份的南昌邀请赛没法比的。在签到处领到了选手物资，袋子上有一个很大的 ICPC 标识，衣服上也有，感觉拿上这个袋子走在街上会非常有排面啊！不过我觉得武汉站的衣服不太好看，配色感觉有点怪，以及背后的文字给人一种校服的感觉。哎总之，感觉这一切都好棒，这完全是我喜欢的氛围！甚至来武汉站找到了一种，和去年打 NOI 的时候相似的感觉。接下来是热身赛，在体育馆。赛场的氛围也好棒，但是 ICPC 比赛的氛围反而又跟 NOI 不太一样了，大家都在讨论，NOI 的赛场是安静地呼吸声都可以听到的。简直太棒了。以及，武汉站有中文题面！对我这种英语不好的选手来说简直是重大利好。热身赛结束以后参加了面基，见到了好几位非常强的选手！好吧图片有点过曝了。但大家应该都认得出来！有一位队友晚上九点多才到，反正我没啥事了，就去接他了。然后在一起去海底捞吃了个夜宵，武汉的海底捞有一个我在内蒙从来没见过的，超级好吃的炒饭！总之就是非常非常好吃！其实还有一个小插曲。晚上吃饭的时候收到一条短信，然后我破防了。本来是下午四点半的飞机，调时到六点了。这班飞机飞的是虹桥，这样我就赶不上九点十五分在浦东的飞机了。但是我的票不是联程票，就是我是两段拆开买的，这也就意味着我需要支付第二段超级昂贵的退票费。退票的时候突然发现有一张退票券，真的是救我命了。这下周日肯定是回不去了，只能旷掉周一上午的课了。11.2今天是比赛日！武汉站不让带饮料，只好放弃带咖啡的想法了（哭）。等我看到十分钟才有人过了签到题的时候，我就意识到有点不对劲了，前面那句“来对了”似乎成为了一个伏笔。接下来一直在边想题边看榜，发现 E 和 F 过的人居然差不多。过 F 的人略多一点，所以我们先想了 F。后来感觉有点没前途，就去想 E 了。具体题意是什么我忘了，只记得是一个很神秘的结论，然后大概在四十多分钟的时候过掉了 E。我没记错的话，这个时候已经在银牌区了，可想而知今天的题有多逆天。接下来就是考虑开 F 了。其实我也忘了 F 是怎么开出来的了，但反正是很快“注意到”了一个结论，然后就出来了。这会才刚刚一个小时，我们现在应该还是在银牌区的。接下来开得最多的题就是 M 了，于是我们考虑想 M。其实看到是构造题的时候我就有一种不好的预感了。题目里给了一个和行列式有关的公式，因为我们三个人都忘记行列式怎么算了，所以看到的前半个小时其实是根本没读懂它是什么意思的。事已至此，先吃饭吧。武汉站的午饭也是麦当劳，汉堡是我最喜欢的双吉（开心）。不过其实送到我们手上的时候已经有点凉了，而且菠萝派已经潮了，味道一般吧。接下来就是继续坐牢，又坐了一个多小时牢。我看着这个榜，越看越不对劲啊，为什么 M 已经过了一车人了。这题真有这么难吗？这个时候我们的注意力集中到了那个，“空行列式的值等于 $1$”上面。然后发现只要令$a_{i,j}$ 等于一个什么东西就好了，就过了。反正这个结论非常简单，最后代码好像只有十行左右。我真的不知道它为啥是对的，但就是推出来了这么个东西，但它就是对的。这个时候已经掉到铜牌区了。不过我们罚时非常低，直到封榜前也一直在上位铜。接下来就是一直在想 H 了，是一个神秘交互题，结果也众所周知的没过。但其实后来了解到，到最后比赛结束的时候，我们已经离解出这题非常接近了。我们只想到了询问 $0$ 可以得到最小值，只差想到询问 $\infty$ 可以得到最大值了。遗憾离场，反正就是感觉全程都在和出题人对脑电波。不过我们封榜前离铜牌线还有八十多名，我不信这一个小时能有这么多队超过我们。结果也没什么悬念，确实在铜牌区。这场队友的发挥简直太牛了，感觉我全程都在抱他大腿，我的铜牌梦也是他带我圆的。本来看完滚榜就打算去吃饭的，然后我们刚到商场，我看到武汉站的群里说，可以花 30 元购买一个和自己获奖相同的牌子，甚至包括打星。然后我又飞速骑车回去（），买了铜牌。其实是棕色的，但我不知道为什么拍出来这么红。这个简直太酷了，现在是心满意足地离场了！接下来就是三个人在一起吃了个饭，就分开了。我去了昨天晚上新订的酒店，在一个离机场更近的地方，方便我明天早上赶飞机。11.3武汉站就算结束了。虽然不是正式参赛，但我也确实非常爽吧，感觉所有体验都非常棒。我就说坚持下去打算法竞赛一定没有错吧！又来天河机场了。早上居然中奖了，坐到了东航的冰雪奇缘号！这个也算因祸得福了吧（？）。总之很幸运！然后就是回学校上课了，这部分内容就告一段落了。11.6今天 CSP-J/S 复赛正式出分了，其实我没想到今年评测这么快。今年报了入门组的同学都考得非常好，报了提高组的基本都炸了。我知道今年提高组的题比前两年难了一点，但我不是前几周的模拟赛都给你们做过类似难度的题了吗（哭）。11.14最近一个星期一直在写迷惑行为大赏，实在没空更新游记了。现在是 11 月 14 日中午，我正在前往沈阳的飞机上，刚刚写完迷惑行为大赏。刚才在机场的时候发了一个登机牌的照片，然后一位朋友问我是怎么申上沈阳站的外卡的。想到自己接下来要说什么就想笑。其实最开始的想法是，既然是省赛，拿牌子的难度应该不会很高，还能过算法竞赛瘾，还能和打沈阳站的朋友们面基，于是就报名了。前几天公布参赛队伍的时候，省外好像只有 22 个队伍报名，也就是说省外队伍只有 13 个牌子。我不清楚这些队伍的水平，但是我的水平也没有多高，感觉哪怕是省赛也要被薄纱了。拿牌子的希望突然变得渺茫了。不过倒也无所谓，本来就是抱着旅游的心态打的。这应该也是我的 XCPC 生涯中第一次真正意义上的单挑，不用考虑其他人的感受果然自在多了。好吧其实也是有点想拿牌子的。到酒店以后又把图片之类的完善了一下，这次算是彻底完成了！不过因为等下要去签到和打热身赛，我怕万一出现什么问题我没空处理，所以决定晚上再发。不过我把这个消息发到了 LA 群里，居然收到了好多的 /bx，其实是超级开心的啊！很少感受到的一种，被好多人认可的感觉。然后想起来我把我新订购的徽章寄到酒店了，赶快下楼去取。这下不用担心徽章不够发了.jpg。稍微吃了点东西就去签到了。赶上周五的晚高峰了（笑），四公里堵了半个小时，早知道骑车去了。到了以后发现并没有什么很大的阵仗，从门口到体育馆，全程和 LNCPC 相关的东西只有三个指路的牌子，还有一个像区域赛那样大的牌子。但是这会天已经黑了，因为那个板子的材质的原因，开着闪光灯拍照的话就会出现一个奇怪的光点，反正拍出来不好看。我已经尽力调色了。还是明天提前来一会来拍吧。当然这句话也成为了伏笔。然后就上去签到，志愿者小姐姐看我是一个人，问我另外两个队友来了吗，那我肯定要回答来了。然后就成功领到了三倍的选手物资（笑）。不得不说，虽然这个整体的氛围就给我一种，没那么正规的感觉（），甚至今年连 ICPC / CCPC 都不挂了，但是衣服还真的挺棒的。然后我去旁边领教练物资，但是他们说我们报名的时候没有选那个教练到场的选项，所以没有教练物资（哭）。居然还有这个选项，我才知道，但是为啥武汉站就是直接给的。接下来就是直接去体育馆打热身赛了。到了发现，怎么 LNCPC 的队伍信息牌这么，清淡（？）。就只有一个 NEU 和 LNCPC 的标识，下面一个很大的队名，然后就没了。机子还挺棒的，确实是 ICPC 水平的，用起来很舒服啊，包括键盘的手感之类的，用的评测系统也是 DomJudge。我的位置正好面向体育馆的大屏，方便我看评测结果了。发现对面坐的是某校的女队，等下热身赛让我来视奸一下她们水平如何。开赛了！A 题就很一眼啊，其实就是取三个数的最大值然后乘以二，在两分钟的时候就提交了。然后就是看 B 题。翻开题面的一刻有点绷不住，上面放了一个巨大的猫猫虫。看到题目其实愣了一下，就是给你一个不小于 $4$ 的整数 $n$，然后求出四个正整数 $a,b,c,d$ 使得 $\begin{cases}a + b + c + d = n \\ \gcd(a, b) = \operatorname{lcm}(c, d)\end{cases}$ 成立。然后想到是不是输出一个 $n-3$ 然后输出三个 $1$ 就好了，于是就在四分钟的时候交了这题。我去看 C 了。然后这个时候听到对面的小姐姐正在激烈地讨论写代码的软件在哪里，这下听懂了，然后她们找志愿者小哥哥来帮忙打开了 VS Code。C 一开始其实没啥思路，然后就自己造了几组样例手模一下。发现可以归纳得到一个约束，能过样例，但是我也不确定这个是不是充要的，所以就抱着试一试的心态交了，居然过了。这个时候才十八分钟，居然这么顺利。也就是说我三题罚时 24（？），感觉从来没碰到过啊。这个时候我在全场排到了 rk8，震惊了。不过一个比较有趣的事实是，虽然我在全场排 rk8，但是我在省外队伍里排 rk4。居然这么轻松就 rk8，比我想象的要好打太多了。其实也是给我了不少信心。想了半个小时 D，发现想不出来，然后就去测评测机速度了。居然一秒能跑 2e9，神机啊。以及想 D 的时候疑似听到对面在讨论我手好看（？），好吧其实有点开心的。其实后来想到可能是一个数位 DP 类似物，但是我懒得写了。发现有外榜，解榜以后发现即使我后面一个小时没想东西，也只掉到了 rk9，居然吗。火速回酒店发迷惑行为大赏！我不确定是不是和刚刚 CCF 发了获奖名单有关，反正感觉大家都在讨论 CSP 成绩之类的，我在 LA 群里发的宣传很快被顶上去了。但是洛谷上的反响确实和预期一样好！很多人评论和点赞，大家都觉得很好笑，这个对我来说算是一种认可吧。感觉今天所有事情都好顺利，把迷惑行为大赏有关的事情忙完了，成效也很棒，而且热身赛也打得很好，好开心。哦不过，可能刚发的那十几分钟看的人有点多，把我服务器挤爆了（哭）。这会大概是九点左右，我想出去找个商场吃个晚饭，然后打开地图查了一下发现怎么沈阳的商场都是九点半下班，那完了。但是不想吃麦，附近找了一家不排队的海底捞去吃了。到了发现我找不到海底捞在哪（），地图的定位好像失灵了，我在楼下转了大概半个小时才找到。上去以后店员跟我说刚才突然来了一大批人，要等一个小时，破防了。后来求了一会情，勉强答应我等二十分钟进去。然后火速吃完饭回酒店，这会已经是半夜十二点多了。其实最近腱鞘炎又发作了，可能跟最近一直在写迷惑行为大赏有关系，打字强度有点高。为了防止影响明天的比赛，我还是又买了一盒药，吃完就睡了。11.15没睡醒，我不想早起呜呜呜呜。点了一杯超级大的冰美式，一升装的，然后就拿着去赛场了。早上去了想拍一下 LNCPC 的那个大牌子，发现已经换成 ICPC 的了。那也行，拍个照就当我打过 ICPC 沈阳了。大概八点四十多分就到座位上了，其实挺无聊的，不能碰机子不能碰题。就这么干坐了十几分钟，终于等到开赛了。按照 VP 去年省赛以及昨天热身赛的经验，签到题应该很一眼，我就没有等榜单，直接去翻题面了。还好这次的第一个签到题在 C，比较靠前。大屏上也显示有人过 C 了，于是火速写完交了。看了一眼榜，我现在是总榜 rk5，省外榜 rk2，前途一片光明啊！然后继续翻题面，大概浏览了一遍，发现已经没有像 C 这样，不用仔细读题意也能一眼会做的题了。看到大屏上有人过了 I，我就去看 I 了。不过仔细读了一下 I，发现其实也挺一眼的，排个序贪心扫一遍就过了。交完 I 大概是十分钟，这个时候我的总排名好像掉到 rk8 去了，但是省外榜还是 rk2。事后发现我的 I 甚至还是省外榜的一血。仍然在金牌线以内啊！还是很激动。这个时候榜上的很多人都去做 D 了，我也就跟着看 D。刚开始看的时候读假题了，以为是要直接 DP 求最小代价，写出来以后发现过不了样例，重新读了一下题才发现可以任意重排顺序。然后一个很直接的想法就出来了，只要判断能否以 $1$ 的代价或者 $2$ 的代价通过，否则代价一定为 $3$。对于代价为 $2$ 的情况，我没多想，直接把六种情况全部枚举了一下，导致代码稍微有点不好写，浪费了几分钟时间在写代码上。交 D 的时候已经是 42 分钟了。这中间有大概二十分钟都是浪费在读假题上的，但是当时还没意识到这二十分钟的重要性。接下来应该去开 J 了。J 其实挺一眼的，开个 umap 就全搞定了，简单到我怀疑我是不是真的读对了，因为从榜单上反应的结果应该是 J 比 D 难的才对。读了好几遍，确定自己没读错以后，才开始写代码的。超级好写啊，交 J 的时候才刚刚 55 分钟。看来是榜被带歪了，早知道先去开 J 就好了。接下来就是 L。其实看到 L 是有点没头绪的，于是我就先打了个表看看。因为 $r$ 和 $c$ 都是一个排列，自己模拟数据的时候为了观察方便，我就直接钦定 $r$ 就是 $1, \cdots, n$ 了。这个时候就想到了，其实我构造矩阵的时候可以先不同时考虑 $r$ 和 $c$，直接钦定 $r$ 严格升序，输出的时候访问 $a_{r_i, j}$ 就好了，就像把 LCS 问题转化成 LIS 问题一样。因为要求填进矩阵里的数都要在 $[0, n]$ 内，所以有了一个贪心的想法，就是对于每一行都从高往低填，$c_j$ 越大的位置 $a_{i, j}$ 就填得越大，剩下的无脑填 $0$ 就好了。不确定对不对，但是样例好像是没问题的，交了一下发现过了。这个时候是 94 分钟，我在总榜的排名已经掉到 rk18 左右了，省外榜也掉到 rk6 左右了，具体多少我记不清了。但反正，因为只有 22 个省外队，那么就只有 13 个牌子，那么我银牌应该就悬了。到饭点了，吃饭！不过发现午餐居然不是麦当劳，给了一袋子杂牌零食，还有一个看着完全没食欲的面包，以及一瓶乳酸菌饮料。没有任何想吃的欲望，还好我提前买了一个桃李巧乐角（应该是叫这个名字吧）。吃了一个面包和两块士力架，然后就继续去写题了。不过还有三个半小时，我觉得还能过一道题，应该不至于拿不到铜。接下来榜上过 M 的有五个队，过 E 的有三个队，已经隐隐感觉有点不对劲了。M 过的人稍微多一点，我就去看 M，M 的开头也是一个很大的猫猫虫。很快想到一个思路就是普通的排序贪心，但感觉已经快两个小时了，仍然只有几个人过了，还有非常大量的错误提交，感觉不太对劲，但还是写一下。写完发现样例是能过的，交了一下果然错了。感觉 M 有点没前途，所以就去看 E 了。E 的开头也是一个猫猫虫，甚至还有一段“Capoo”（猫猫虫的名字）的诗。猫猫虫可爱喵。接下来的三个小时就一直在想 E。对面的女队始终只过了一题，后来听到她们聊天，说“三个人被人家一个人爆杀了”，其实还是有点暗自窃喜的。以及听到她们在讨论某道题的解法，好像有，交了一发代码，超时了，要把六重循环优化一下，可以优化到五重循环。我大受震撼。到最后想到了对每个剩余类都求一个模意义下的前缀和，然后用单调栈维护一下两侧最大数字更大的数的位置，大概 270 分钟的时候写出来代码了。但是过不了样例，尝试调了十几分钟，然后发现我把自己的代码 hack 了。破防了。封榜前我在总榜大概是第三十多名，省外榜掉到了 rk14。也就是说我现在是铁牌第一名。我现在是 5 题和 203 罚时，按封榜前的成绩来看，我在省内队伍里能排到 rk23 的位置，也就是说省外队伍打铁的水平在省内是上位银。不是，谁和我说省赛强度不高的？看了一眼罚时，铜尾是齐齐哈尔大学，5 题和 181 罚时，只比我少了 22 分钟。更破防了。然后就是耻辱下播。不过其实今天的题做得还挺舒服的，至少比武汉舒服多了。其实还挺好奇的，问了一下对面的女队卡在什么地方了，然后和我说卡在 D 了。死因是不知道 Runtime Error 是什么意思，也不知道 D 应该怎么做。我就简单给她们讲了一下做法，应该听懂了（？），反正那位 Coder 露出了一副恍然大悟的神态。她们说是第一次打 ACM，其实我猜到了，但感觉缺乏充分训练的前提下，能开出签到也挺厉害的。于是简单致了一些鼓励，还是祝她们接下来可以打出一些成绩吧。虽然知道我一定铁了，但还是想记录一下我的滚榜，然后就等着了。讲完题应该到滚榜了，然后主持人说的是，颁奖仪式（？）。滚榜都没有。是正规比赛吗。铜牌的最后一名颁给了齐齐哈尔大学，没有希望了。然后就是，愤而离场。其实比赛刚结束的时候真的很气很气，我隔一会就要深深喘一口气的状态。不过其实边看颁奖也一边在进行一些更深刻的思考，大概想到，其实我本来也没准备拿牌子，以及不考虑省外队伍的话，我刚上大一两个月就打到了辽宁 rk23，好像也是我挺满意的成绩了。然后好像就基本上想开了。心情其实一般，但想着发动态还是发点好的吧（x），所以就只发了一些，竞争性真相。准确的说就是，我只在动态里提到了辽宁 rk23 这个事实，而没有写打铁了什么的。看到确实有很多人在评论区里认可我，这个时候就没有非常难受了。就当这次又成功把自己骗过去了吧。11.16今天回学校，赶早（？）班机。好吧其实是中午十二点的。起床以后火速去了机场，发现沈阳机场的指示牌的配色方案好新颖，真的给人一种眼前一新的感觉。走易安检通道过了安检，发现里边的设计更棒！就感觉整个空间，又宽敞又大气。今天又是远机位。沈阳机场的远机位登机口为啥这么远，需要从安检口走到北指廊中段。不过挺幸运的是，登机的时候见到了星盟涂装的国航 321，应该是国航唯一一架星盟涂装的窄体机？真的好好看！接下来需要在锡林浩特经停，下飞机的时候破防了。沈阳远机位那也行吧我能理解，但是锡林浩特这种支线小机场还停远机位是不是过分了。而且没有摆渡车，我穿着一个很薄的羽绒服，在零下十几度刮着六级风的锡林浩特走了好几分钟到航站楼。接下来就回呼市了。呼市也降温了，好冷，我记得我走的时候还是零上的啊。不论如何，一个美好的周末又结束了，又要回到学校熬过去一周的痛苦的生活了。11.17其实上周就听说学校里爆发甲流了，但是因为我从上周二开始就不在学校了，所以也没当回事。回学校以后也在公共场合都戴好了口罩。身边确实很多人发烧什么的，很多人在请假，甚至晚自习基本上只有半个班到了。今天白天一位舍友说他感冒了。不过他不发烧，应该就不是流感吧。只是在考虑要不要剩下这几天回家住，躲一躲甲流。毕竟周末的郑州站还挺重要的，算是我今年唯一一场正式参赛的 regional 吧。11.18今天开始突然有一点鼻塞，还有很轻微的咳嗽，我开始考虑是不是冻着了，毕竟最近大降温确实容易感冒。还是有点担心，决定和班主任请假回家了。晚上回家买了个试剂盒测了一下，流感和支原体都是阴性，放心了，就买了点普通风寒感冒的药。本来打算打今晚的 CF Div. 3，但是晚上打开 CF 准备报名的时候发现另外一个 CF（指 CloudFlare）炸了导致 CF 上不去（笑）。查了一下发现今晚 CF 炸了导致全世界的互联网崩溃了三小时，还是美国佬会整活啊。这下只好直接睡觉了。11.19早上起来发现喉咙变得巨痛无比，咳嗽也加重了，以为是感冒导致的咽炎（我的老毛病）又加重了，也没多想，吃了感冒药就去上课了。白天还是照常喝着冰美式（），加上因为咳嗽导致的不怎么精神，我喝的冰美式会更多点。到了下午，咳嗽变得超级严重，基本上十几秒就要咳一下，一两分钟就要很深地咳一下，像是要把肺都咳出来了一样。下午上政治课的时候，实在太难受了，但是我真的懒得因为一个小感冒去医院，就在美团上找了个医生。她说流感初期可能出现假阴性的表现，我的所有症状以及身边有人感冒，都支持流感的判断。这个时候其实我突然有了一种释然的感觉，就是悬着的心终于死了（）。于是火速买了抗病毒的药和止咳药，下课就去取。有时候甚至咳得有点恶心，太难受了。根本没有任何食欲，今天一整天的进食就是晚上去瑞幸买咖啡的时候强撑着吃了一个瑞士卷。晚上下了自习就直接打车回家了，但感觉不能不吃东西，于是稍微点了一点晚饭，不过其实也只吃了几口。但至少是吃了吧。其实外卖到了的时候已经是晚上十点钟了，这个时候我发现咳嗽已经稍微好转一点了，至少不会咳得那么，撕心裂肺了。明天只有下午的一节体育课，所以晚上可以好好睡一觉，应该明天就会好吧。11.20大概一觉睡到十点多，醒来的时候就是感觉整个人很萎靡，动一下都不想。在床上磨蹭到十二点，然后起床。起床的时候发现整个后背和腰上都有一种肌肉酸痛的感觉，应该是昨天的咳嗽导致的吧。不过咳嗽已经好转很多了，完全没有昨天咳得那么频繁了。起来吃了昨天晚上睡前预约点的早餐，当然确实也没吃几口就是了。量了一下体温，发现有点低烧，怪不得呢。一直在纠结要不要去上等会的体育课，现在的状态真的很，无精打采。当然最后还是去上了，因为请假要扣两分平时分，还是有点舍不得这两分的。雾霾天顶着甲流的发烧和咳嗽上体育课，真难受啊。晚上感觉精神好一点了，咳嗽也好转了很多，可能是退烧了导致的。今晚打 CF 坠机了，就当是给郑州站攒 RP 了。然后就，收拾了一下明天要带的东西，睡觉了。11.21今天已经几乎不咳嗽了！只剩下一点嗓子疼了，虽然说话还是哑哑的。上午上完两节课，然后前往，郑州！从下了飞机就一直在想，自己打，真舒服啊。可以住喜欢的酒店，坐想坐的航班，吃想吃的东西。也不用考虑别人的感受，也不用疲于队友之间的交流，好开心。11.22今天去签到！单挑的好处就是可以独享三倍选手物资，以及教练物资。郑州站的袋子就非常有质感啊，设计感也很足！和去年 NOI 的袋子长得差不多，只是上面印的字变成了 CCPC。这个配色方案真的看上去好舒服，反正总体的感觉就是非常令人，心旷神怡。袋子里边除了衣服还有两个郑州站的徽章，我觉得也超级好看！四份物资直接满满地装了四个袋子。不过我个人感觉选手的衣服有点丑，是白色的身体部分加上绿色的袖筒和帽子。但是教练的衣服弥补了这一点！教练的袖筒和帽子是黑色（或者算是藏青色？）的，感觉非常棒。郑州站比较有趣的是，内蒙所有打 XCPC 的学校都来了，所以在郑州也可以决出“内蒙王”。还是有点胜负欲的吧，或者准确地说，我其实有点想，单挑超过内大。当然，其实也不太相信自己真的能，我太清楚自己的水平是什么样子了。网络赛那次虽然已经超过内大一次了，但那次也确实还是有形式队友的，郑州站这次就是任何意义上的单挑了。接下来就是进场看开幕式以及参加热身赛了。开幕式一如既往的没啥意思，除了主持人请 CCPC 主席发言的时候念成了 CCF。郑州站的评测系统用的是 Hydro，场上不出意外地有很多选手不会用。桌子上放了郑州站的伴手礼，是三个大象玩偶，我觉得非常可爱啊！热身赛 A 挺简单的，九分钟切了。看了眼 B 发现有点不会，想了十分钟没啥思路，就开摆了（）。然后发现大家都在开 E，看看 E 是啥。大概题意是，给你一个递推式，你需要从 $a_0$ 推出 $a_{10^8}$ 并输出。但是只说了 $a_0$ 是一位出题人的生日，并没给具体的值，神人 E 题。接下来面基了想认识好久了的内大的队伍，聊了一会，顺便发放了我的徽章。我装徽章的袋子里有一枚 Ucup 徽章，他们看到还以为我是神秘 Ucup 徽章志愿者，太高估我了（哭）。晚上参加了腾讯的校招活动。不得不说茶歇真的好美味，我又来当学术蝗虫了。然后有很多抽奖环节，居然抽中了一个腾讯招聘的袋子。把这个发到动态里，让大家以为我已经解决就业了。11.23九点开始比赛，早上一睁眼八点三十三分了，太吓人了。火速赶到赛场。到了体育馆就已经八点五十多分了，存包处在二楼，放好包跑到座位上就已经还剩一两分钟了。不过行李贴纸确实挺好看的（）。到座位坐好以后，旁边老哥惊诧地问我，“我真是一个人啊”，他们以为我昨天说单挑是开玩笑的（笑）。今天考场发的笔居然是专门定制的，上面有 CCPC 的字样，还有一个 JetBrains 的 logo，好酷！接下来就是开始比赛了！翻了一下题面，发现 G 和 M 看起来都挺像签到的，发现更多人在做 M，于是就去看 M。最开始想的是，直接暴力地对每个位置都判断一遍就好了，但想了一下发现是 $O(n^2)$ 的，应该不能这么暴力。想到，是不是只需要判断最左边和最右边就好了，测了一下样例是能过的，但是交了一下发现 WA 了。接下来改了一下再交又 WA 了。感觉这个做法应该不太对？但是我有点想不出来了，还是对拍一下吧。对拍大概写了半个小时，有点不好写其实。对拍出来发现，其实刚才的思路是对的，只是少考虑了次左和次右的情况，加上就过了。但这个时候其实已经 110 分钟了，怎么签到题签了两个小时。看了一眼榜，发现内大 93 分钟的时候过了这题，但是我比他们少一发罚时，现在是内蒙第一！接下来考虑下一题。现在过 B 的人和过 G 的队伍数量差不多，想了一会 B 发现没前途，于是剩下的时间就一直在想 G 了。当然，直到比赛结束也没开出来，坐了三个小时牢。其实比较值得一提的是郑州站的午餐！虽然没有麦当劳，但是有德克士的汉堡，以及一个名字叫“马斯卡彭”的蛋糕，这个真的超级好吃！之前在郑州群里看见他们说好吃就已经在期待了，太美味了。当然吃多了稍微有点腻就是了。赛后和内大的两位聊了一会，他们也没开出来 G，以及深刻地批判了这场比赛。其实这个时候我的“单挑拿到内蒙第一”基本上已经没什么悬念了。封榜期间其他三个学校也有一些提交，但是我不太相信我开不出来的题他们能开出来。当然我知道这个观点有点太自大了，所以其实也不太敢相信这个观点。尽管过会解榜了以后确实印证了我的推断。那我就算当了一次“内蒙王”？我不知道。“单挑打到全省第一”似乎听起来还挺酷的，但是也确实无法改变我只能开一题的事实，我的水平还是非常低。其实我的心情很复杂，一方面我在第一场和省内这么多高校的角逐中就拿到了第一，我为此而自豪，但另一方面我也确实非常清楚我自己的水平还差得远，我“没资格因此而开心”。我不知道怎么表达我的情绪，但至少这些都过去了。当然，晚上发的动态还是只挑了正面的那部分发出来，主要是给同学以及一些算法竞赛无关人员看的。业内人士大概看一眼就知道这没什么可吹嘘的就是了。晚上十点半的飞机，接下来有相当多的时间，不想开钟点房，还是去机场待会吧。到东站坐城际去机场，在下到站台的电梯上发现旁边站台停着一辆动检，确实是第一次亲眼见到动检，这太幸运了！接下来就是在机场不知道做了些什么，反正就这么消磨过去了几个小时，然后就登机了。登机的时候发现内大的两位选手和我坐同一班飞机，不过他俩应该没认出来我。起飞后发现神人乘务组在过东京时间。原本我估计十二点之前就能落地，起飞后空乘播报的落地时间是“凌晨零点四十五分”，我还以为是有什么突发的交通管制，需要绕一个小时。直到十一点十五分的时候，广播说还有半小时落地，我才相信是刚才念错了。——直到十一点四十五分，落地后空乘在广播里来了一句，“现在是北京时间凌晨零点四十五分”。然后就是照常地回学校了。郑州站之后就没有正式参赛的 XCPC 比赛了，出于一些现实压力，我需要暂时搁置一段时间的算法竞赛了。其实在和朋友聊到这里的时候还是有点难受的，有点像去年打完 NOI 以后的那种空落落的感觉，不过倒也没那么强烈。11.29浑浑噩噩地又熬过了一个星期，该启程了。坐早班机飞重庆。严肃抵达重庆，并且与队友会师。又来到这个承载着我一半 OI 生涯的城市了。打车都走了一个多小时才到了重大，实在是太远了。学校里又走了好远，我恨这个没有共享单车的城市。好吧重庆这个地形可能有共享单车也没法骑。不过重庆站不像郑州站那样到处都有指示牌，进学校走了好久才看到一个挂在路灯上的旗子，以及一位志愿者。但校园里的风景真的没得喷，太棒了。飘落满地的金黄的银杏叶，以及一些仍然富有生机的绿色的点缀，真的有一种充满活力的感觉。然后就去签到处领了选手物资和教练物资，不过遗憾的是来得有点晚，给教练的赞助商礼品已经送完了（哭）。重庆站的袋子也挺好看的。然后就是下午的热身赛，真是图书馆比赛啊。先来看点难蚌的。到了发现还是有三把椅子的，只不过是把三把椅子塞到了两人桌的前面而已（笑）。我不知道图上能不能看出来，但真的很挤。晚上和几位同样来打重庆站的朋友们去吃火锅，但是我们五个没有一个人是能吃辣的（）。然后就：不是真的有人看到这个能蚌住吗（）。吃完大概逛了会，在楼下的永辉里发现居然有马斯卡彭，我已严肃购买。非常美味啊。11.30今天是比赛日！比赛具体过程我忘了，反正大概就是最开始我开了一个签到，然后就 All in 另一道题了。午餐发了肯德基，只能说味道还行吧。剩下的时间就是一直在，思考，分讨，思考，分讨。然后大概四个半小时的时候，终于分讨完了！写完代码发现样例过不去，然后发现题读假了。谁懂那种大力分讨三个小时然后发现题读假了的救赎感啊。哎有一种很释然的感觉（），然后就开摆了。一直到结束，其实我没什么感觉，就是很平静，但好像也不是不在意，我说不出来那种感觉，反正比较怪但也没有很难受吧。晚上换了家离机场近的酒店，方便明早回学校，正好能赶上周一的早十。12.1早上迷迷糊糊一睁眼，打算看眼时间，然后发现我的航班开始登机了。吓醒了，丸辣！这样的话，上午的课肯定就要旷掉了。下午还有一节课，直接从重庆走的话，坐下午那班飞机好像来不及。于是决定先坐高铁去成都然后再飞回内蒙。晚起了半个小时，怒亏八百块钱。我再也不熬夜了。回来以后，接下来一段时间可能就要彻底与算法竞赛隔绝了吧，其实心里还是挺不舒服的。但，现实的压力已经压得我根本喘不过来气了，我始终都好累。那，明年见。
虚无。似乎成为了过去式，他看到了光。至少，这次已经足以让他坚信。他早已充满热情，哪怕是仍然微弱的光芒，也足以让他徜徉在喜悦中。足够明亮，也充满希望——足以让他忘却一切，那些，所谓的，阻力。他知道，顺着光，他会找到那个足够坚实，也足够可靠的港湾。对吗。他总是这样问自己。他总是可以这样骗过自己。尽管，始终沉沦在混沌的深海中。若隐若现。隐。匿。$\texttt{Written on 2025.12.11.}$
本文同步发表在洛谷专栏，你也可以点击这里以获得更佳的阅读体验。下面是往期的迷惑行为大赏：NM 2023 NOI 春寄测试 迷惑行为大赏NMOI 2023 迷惑行为大赏NM CSP 2023 迷惑行为大赏喜报，今年已经是内蒙古（NM）连续第三年举办 CSP-J/S 第二轮认证了！本次认证中，共有 $543$ 位选手参加了 CSP-J，有 $431$ 位选手参加了 CSP-S。今年的参赛人数变化十分耐人寻味，CSP-S 的参赛人数一如既往地疯狂增长，涨幅达到了 $59 \%$，但CSP-J 的参赛人数竟然有所减少，较去年降低了 $18 \%$，笔者推测这种现象或许与今年禁止低龄选手参赛的政策有关。今年也是 CCF 第一次禁止低龄选手参赛，在这样的政策下，内蒙古的选手们在本次认证中的抱铃比例降低到了惊人的 $43 \%$，也就是说，有超过 $57 \%$ 的选手取得了不低于 $1$ 分的好成绩！这样的飞速进步无时无刻不在昭示着世人：内蒙古的 OI 事业正在蒸蒸日上！这无疑证明了在世界经济下行的大背景下，我国民间仍然存在大量的慈善家，愿意为伟大的慈善事业贡献一份属于自己的力量。很遗憾的是，我们已经无法在今年的赛场上见到他们了，让我们期待他们长大后继续作出的伟大贡献吧！笔者在撰写本文时，尚未得到 CCF 作出的有关选手准考证号与姓名、身份证号、手机号、洛谷账号等传统个人信息的相关性论证的调研报告。因此，我们将在下文中直接使用选手的准考证号，作为识别他们的唯一标识。另一个原因是笔者目前暂时未掌握盒武器的相关核心技术。但笔者相信，随着科学技术的研究进一步深入，我们对相关技术的掌握会变得越来越深刻！此外，在 AI 技术正在迅猛发展的当下，内蒙古的选手们也选择了紧跟时代的脚步，尝试以极具创新意义的方式拓宽“人机边界”的可能性，在算法竞赛的舞台上展开了一场极具前瞻性的实验性探索，新颖的研究结果实属令人叹为观止！我们将在下文中进一步讲述。来自内蒙古的 $974$ 位选手中，在三个半（或四个（或七个半））小时的时间内，在 $3446$ 份扩展名为 .cpp（包括 .cpp.cpp）的文件（或文件夹）下，写下了：$6147$ 个 freopen（包括 $119$ 个 //freopen 或 // freopen）。$4737$ 个 return。$3743$ 个 include（包括 $4$ 个 includes）。$3734$ 个 stdin（和 $3$ 个 sdtin）。$3689$ 个 stdout（和 $1$ 个 stfout）（虽然笔者并不清楚为什么与 stdin 的数量不相同）。$3333$ 个 main（和 $6$ 个 mian）。$2973$ 个 bits/stdc++.h。$1240$ 个 fclose（虽然笔者并不理解为什么有这么多人写这个）。$346$ 个 iostream。$136$ 个 cstdio。$168$ 个 define。除此之外，一个令人哀叹的事实是，在本次认证的代码中，笔者还发现了 $7$ 个 fuck、$4$ 个 cnm 和 $3$ 个 tmd，这是否成为暴戾语言势力重新入侵 OI 的表现，我们不得而知。但不得不承认的是，CCF 曾发表的《关于个别选手在NOIP 2021中使用暴戾语言的处罚公告》的含金量仍在上升。但冰冷的数据总是无趣的，或许只有认真鉴赏过各位选手的代码后，我们才能领略其中的精髓。NM-J00012 同学在他的每份代码末尾都编写了一段注释，似乎在传达着美好的期许。让我们恭喜这位同学在民间数据的测试中取得了 $163$ 分的好成绩！NM-J00014 同学在 polygon 文件夹下创建了一份名为 palygon.cpp 的文件，并尝试读取和写入 palygon.in 和 palygon.out 文件。同时，我们有理由怀疑这位同学赛时所使用的键盘的拥有着 $\texttt{F}$ 在 $\texttt{D}$ 左侧的奇妙布局。NM-J00021 同学在选手文件夹下创建了名为 number.cpp 的文件夹，并在 Untitled1 文件中写下了一份疑似受到宇宙射线影响的文字。同理，家长也会用付费对宇宙射线表示支持。NM-J00023 同学试图使用语言的力量感化评测姬。为了防止无法清晰地辨识代码的语言，NM-J00028 同学贴心地向评测姬反复重申了这一要点。哪怕是在我国最北方的内蒙古，这份温暖也足以让内蒙古的冬天变得不再寒冷！为了可以顺畅地使用 sort 函数，NM-J00044 同学在 polydon.cpp 中引入了 sort 头文件，并使用 frepone 函数完成了文件读写操作！NM-J00052 在注释中写下了一串疑似祈愿的语句。但我们仍然要重申，盲目迷信是不可取的。NM-J00087 同学疑似来自鄂尔多斯市东胜区第八小学，短短的一行注释，洋溢着的全部都是发自肺腑的自豪之情。这也无时无刻不在印证着一个事实：内蒙古的选手们太强大了！NM-J00127 同学似乎不太喜欢循规蹈矩的标准（Standard），于是他在四份代码中都引入了 bit/c++.h。回想当下，似乎我们应该为这样敢于打破常规的勇气点赞。NM-J00135 同学似乎正在尝试对文件读取和写入数据。NM-J00144 同学在注释中写下了他对题意描述的不满，显然，$\sum$ 符号的含义似乎仍然不够深入人心。或许 CCF 在出题时也应考虑这一重要观点：普及组一定要普及。值得一提的是，根据某知名算法竞赛平台对于同水平比赛的投题要求：所有题出现的所有数学概念不得超过初中范围。（例如，求和不得使用 $\sum$ 符号，而应使用省略号表示。）我们有理由怀疑出题人将已经被该平台驳回的题目投到了 CCF，并获得了通过。时隔一年，NM-J00213 同学似乎仍然无法忘记令他心心念念的 CSP-J 2024，并在代码里尝试对 poker.in 和 poker.out 进行操作。“数组开小了”往往是很多选手挂分的重要原因，因此 NM-J00216 同学针对这一隐患做了万全准备。NM-J00260 同学同样表达了他对题目的不满，似乎本场比赛的题目被诟病并非个例。NM-J00285 同学在注释中写下了一句刻骨铭心的感慨：十年 CSP 一场空，忘了代码见祖宗。NM-J00290 同学显然是一位英语大手子，在比赛时也十分注重动词第三人称单数形式的运用。这也说明，哪怕是在 Scratch 横行的当下，英语水平仍然是踏入程序设计这一领域的巨大门槛。尽管本场比赛的题目十分困难，但 NM-J00301 同学仍然保持了十分的热忱。在这样的热情下，想必他的 OI 生涯也一定会取得满意的成绩！NM-J00322 为我们破解了收费网站，让我们感谢他的伟大贡献！终于看到好活了。NM-J00398 同学也同样在选手文件夹中反复声明了所使用的语言，但目前笔者暂不了解这位同学和 NM-J00028 同学之间的关系。NM-J00522 同学在注释中向一位可能名为 WLT 的同学传达了爱意，让我们向两位表达诚挚的祝福！NM-J00537 同学在极度沉重的心情中，带着不甘的梦，以坚定的信念写下了一句振聋发聩的 //freopen。NM-S00013 同学在他的代码中留下了一段简短的游记。可以看出，NM-S00041 同学是真的不会了。不过，现在有人看到了（笑）。NM-S00075 同学向世界打了个招呼。经典的打招呼环节。NM-S00095 同学坚持在代码中使用中文逗号，促进了人类与编译器的文化交流，他才是真正的文化使者！NM-S00102 同学正在尝试输出一句“我不会”。尽管如此，为了防止评测姬被这简短的三个字搞得一头雾水，他仍然耐心地将整个题面都复制了上来，共计 $552$ 行。NM-S00160 同学在程序开头编写了一行较长的注释，似乎在向本场比赛的题目发起谴责。截然不同的是，NM-S00167 同学似乎在注释中写下的是充满感激与热爱的文字，尽管笔者目前尚未查明 $\texttt{secoud}$ 的含义。如果说上面两位同学发言的对象都是 CCF，那么 NM-S00192 同学则直接讲矛头伸向了考场周围的选手们。不论如何，这样恶毒的诅咒是我们应该深恶痛绝的。为了保持内蒙古人民一贯的高素质，笔者宣布将这位选手开除内蒙古籍。是的，本场比赛的题目创死了很多人，或许也包括 NM-S00195 同学。NM-S00208 同学也同样正在向世界打招呼。但不同的是，他似乎正在面临着是否退役的痛苦抉择。尽管我们无法确定他最终要如何选择，但似乎仍然可以在这里向他道一句 OIers 常用的告别祝福：祝好！接下来就要进入笔者认为本文最有趣的部分了！NM-S00251 同学完全不会做本场比赛最简单的 T1，代码内容仅包含一个输出“不会”二字的语句。同时，我们也有理由怀疑 T2 和 T3 其实是两道非常经典的板子。在这位选手的不懈努力下，提交了一份足够美妙的答卷。让我们恭喜他在官方数据的测试中，取得了 $179$ 分（$0 + 100 + 75 + 4$）的好成绩，位列内蒙古第 $5$ 名！当然，或许是这位选手极其敏锐地注意到了评测姬的判题体验，为了防止评测姬在同一种编码下频繁地阅读代码导致的审美疲劳，他贴心地在 employ.cpp 中使用了 GB 2312 的编码格式，而其余三份代码则继续使用了更常见的 UTF-8。幸运的是，评测姬果然没有辜负这片苦心，在这题中给他留了 $4$ 分的印象分。另外，可能是出于同样的原因，他也在 road.cpp 中使用了 freopen 来进行文件读写，但在 replace.cpp 和 employ.cpp 中使用了 fstream。但简单的文字描述总是不足以突出这份良苦用心的。为了能够足够深刻地理解这份作品，我们仍然需要认真鉴赏这位选手在代码中留下的注释。已完成今日如果你看到这里了那我就可以告诉你一个惊喜大学习。NOI 竞赛委员会主席杜子德先生曾在很多场合反复提到了一句话，即，做干净的奥赛。现实也雄辩地证明，这句话在各种比赛的论证后，成为了事实。尽管外界质疑声频频，笔者仍然愿意相信这位选手的实力，以及干净的奥赛。不论如何，这位选手的代码仍然值得我们细细品鉴。T1 club.cpp（UTF-8）：#include <iostream> using namespace std; int main(){ cout<<"不会"<<endl; return 0; }T2 road.cpp（UTF-8）：#include <bits/stdc++.h> using namespace std; struct FastInput { static const int BUFSIZE = 1 << 20; int idx, len; char buf[BUFSIZE]; FastInput() : idx(0), len(0) {} inline char nextChar() { if (idx >= len) { len = fread(buf, 1, BUFSIZE, stdin); idx = 0; if (len == 0) return 0; } return buf[idx++]; } template <typename T> bool read(T &out) { char c = 0; T sign = 1, val = 0; c = nextChar(); if (!c) return false; while (c != '-' && (c < '0' || c > '9')) { c = nextChar(); if (!c) return false; } if (c == '-') { sign = -1; c = nextChar(); } for (; c >= '0' && c <= '9'; c = nextChar()) val = val * 10 + (c - '0'); out = val * sign; return true; } }; struct Edge { int u, v; long long w; int mask; }; struct DSU { vector<int> parent, rnk, cityCnt; DSU(int n = 0) { init(n); } void init(int n) { parent.resize(n + 1); rnk.assign(n + 1, 0); cityCnt.assign(n + 1, 0); for (int i = 1; i <= n; ++i) parent[i] = i; } int find(int x) { while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; } return x; } bool unite(int a, int b, int &cityComp) { int ra = find(a), rb = find(b); if (ra == rb) return false; bool ca = cityCnt[ra] > 0; bool cb = cityCnt[rb] > 0; if (rnk[ra] < rnk[rb]) swap(ra, rb); parent[rb] = ra; cityCnt[ra] += cityCnt[rb]; if (rnk[ra] == rnk[rb]) ++rnk[ra]; if (ca && cb) --cityComp; return true; } }; int main() { freopen("road.in", "r", stdin); freopen("road.out", "w", stdout); FastInput in; int n, m, k; if (!in.read(n)) return 0; in.read(m); in.read(k); vector<Edge> edges; edges.reserve((long long)m + (long long)n * k); for (int i = 0; i < m; ++i) { int u, v; long long w; in.read(u); in.read(v); in.read(w); edges.push_back({u, v, w, 0}); } vector<long long> costTown(k); for (int j = 0; j < k; ++j) { long long cj; in.read(cj); costTown[j] = cj; for (int i = 1; i <= n; ++i) { long long a; in.read(a); edges.push_back({n + 1 + j, i, a, 1 << j}); } } sort(edges.begin(), edges.end(), [](const Edge &a, const Edge &b) { return a.w < b.w; }); int totalNodes = n + k; DSU dsu(totalNodes); int totalMasks = 1 << k; vector<long long> addCost(totalMasks, 0); for (int mask = 1; mask < totalMasks; ++mask) { int lb = __builtin_ctz(mask); addCost[mask] = addCost[mask ^ (1 << lb)] + costTown[lb]; } long long answer = LLONG_MAX; for (int mask = 0; mask < totalMasks; ++mask) { dsu.init(totalNodes); for (int i = 1; i <= n; ++i) dsu.cityCnt[i] = 1; int cityComp = n; long long mstCost = 0; for (const auto &e : edges) { if (e.mask && ((mask & e.mask) == 0)) continue; if (dsu.unite(e.u, e.v, cityComp)) { mstCost += e.w; if (cityComp == 1) break; } } long long total = mstCost + addCost[mask]; if (total < answer) answer = total; } printf("%lld\n", answer); return 0; }T3 replace.cpp（UTF-8）：#include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; const ull BASE = 1315423911ull; const size_t MAXLEN = 5000000 + 5; const long long COMBO_LIMIT = 200000; static ull pw[MAXLEN]; struct PairKey { ull h1, h2; int len; bool operator==(const PairKey& other) const noexcept { return h1 == other.h1 && h2 == other.h2 && len == other.len; } }; struct KeyHash { size_t operator()(const PairKey& k) const noexcept { return (size_t)(k.h1 ^ (k.h2 * 1000003ull) ^ ((ull)k.len * 19260817ull)); } }; ull get_hash(const vector<ull>& pre, int l, int len) { return pre[l + len] - pre[l] * pw[len]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); pw[0] = 1; for (size_t i = 1; i < MAXLEN; ++i) pw[i] = pw[i - 1] * BASE; ifstream fin("replace.in"); ofstream fout("replace.out"); int n, q; fin >> n >> q; unordered_map<PairKey, int, KeyHash> mp; mp.reserve(n * 2); struct UP { ull h1, h2; int len; int cnt; }; vector<UP> uniq; uniq.reserve(n); auto hash_string = [&](const string& s) -> ull { ull h = 0; for (char c : s) h = h * BASE + (ull)(c - 'a' + 1); return h; }; for (int i = 0; i < n; ++i) { string a, b; fin >> a >> b; int len = (int)a.size(); ull h1 = hash_string(a); ull h2 = hash_string(b); PairKey key{h1, h2, len}; auto it = mp.find(key); if (it == mp.end()) { int idx = (int)uniq.size(); mp[key] = idx; uniq.push_back({h1, h2, len, 1}); } else { ++uniq[it->second].cnt; } } for (int qi = 0; qi < q; ++qi) { string s, t; fin >> s >> t; int m = (int)s.size(); if ((int)t.size() != m) { fout << 0 << '\n'; continue; } int l0 = -1, r0 = -1; for (int i = 0; i < m; ++i) { if (s[i] != t[i]) { l0 = i; break; } } if (l0 == -1) { fout << 0 << '\n'; continue; } for (int i = m - 1; i >= 0; --i) { if (s[i] != t[i]) { r0 = i; break; } } int diffLen = r0 - l0 + 1; long long combos = (long long)(l0 + 1) * (m - r0); vector<ull> ps(m + 1), pt(m + 1); ps[0] = pt[0] = 0; for (int i = 0; i < m; ++i) { ps[i + 1] = ps[i] * BASE + (ull)(s[i] - 'a' + 1); pt[i + 1] = pt[i] * BASE + (ull)(t[i] - 'a' + 1); } long long ans = 0; if (combos <= COMBO_LIMIT) { for (int pos = 0; pos <= l0; ++pos) { int minLen = r0 - pos + 1; for (int len = minLen; pos + len <= m; ++len) { ull hs = get_hash(ps, pos, len); ull ht = get_hash(pt, pos, len); PairKey key{hs, ht, len}; auto it = mp.find(key); if (it != mp.end()) ans += uniq[it->second].cnt; } } } else { for (const auto& up : uniq) { int len = up.len; if (len < diffLen) continue; int start = r0 - len + 1; if (start < 0) start = 0; int end = l0; if (start > end) continue; for (int pos = start; pos <= end; ++pos) { ull hs = get_hash(ps, pos, len); if (hs != up.h1) continue; ull ht = get_hash(pt, pos, len); if (ht != up.h2) continue; ans += up.cnt; } } } fout << ans << '\n'; } return 0; } //如果你看到这里了 ，那我就可以告诉你一个“惊喜 ” //我不知道会不会有人看这个代码，工整吧 //半个小时 才写出来的 //这个没有road多 //我妈给我报的课我基本没上，纯跟AI学 //AI讲的可明白多了，还是1对1 //总之，看到的话不要惊讶 //昨天AI告诉我，可读的变量名可以让人读的更清楚 //我本来没打算这么写来着，但是有趣的是Deepseek严厉的批评了我 //所以特意去英语速成啦 //至于这个应该没人看见，因为是机器判题T4 employ.cpp（GB 2312）：#include <bits/stdc++.h> using namespace std; int main(){ ifstream fin("employ.in"); ofstream fout("employ.out"); long long n,m; if(!(fin>>n>>m)) return 0; string s; fin>>s; for(int i=0;i<n;i++){long long x; fin>>x;} fout<<0<<'\n'; return 0; }//错了这个，就不整理了 NM-S00258 同学在代码中编写了一种崭新的算法，想必这位选手一定是博弈论的一把好手。为了使评测姬对代码的理解更为深刻，NM-S00329 同学在 club.cpp.cpp 中为每一行代码都加上了（伪）编译日志，或许这位选手也可以被称为“人肉编译器”。以上是本场比赛出现的所有迷惑行为。顺带一提，由于选手较多，共 $3446$ 份代码折磨了笔者一周时间，然而还是没能发现很多高质量的整活。希望接下来的高质量整活可以拥有更大的占比，至少让笔者看代码能有点成就感。本文篇幅较长，如果你看到这里，笔者以 $(CSP2025)_{32} \%$ 的真诚感谢你的支持与耐心。本文由 @RyanLi 撰写，如需撤下或投稿，请在洛谷向我发起私信。后记尽管 NM-S00251 的强悍实力让所有人都为之惊叹，但悲剧也随之发生。正当笔者决定交稿时，却接到了一位神秘选手的匿名投稿。没有任何配文，只有简单的一张图片：怎么会是呢。