Shunpower and His 10 Best Problems:反射我的孤寂

· · 生活·游记

序

得到有些题的时刻在我心里记得太清楚了,所以干脆写下来。我挑出了对我影响最大,同时也差不多是我出得最好的 10 道题,介绍这些题目背后的故事。写完的时候,我感到我的回忆录仿佛也写完了。

我不算是有多少出题天赋的人,我也很笨:OI 没打出来,到最后水平也并不高,还在自己的生活里捅出了海量的岔子。幸运的是,我遇到了永远有耐心的 milo 学长,宁愿听我出的烂题陪伴我的 SA,还有所有的愿意解决我的这些问题的同学们和学长们。我想我永远无法忘记纪中宿舍,成外宿舍和南京酒店了。

应当注意,这篇文章会剧透这 10 道题的做法。

My Problem List.

EP01. 烟花:故事的开始

从小时候开始,我就喜欢出题。当我在 X 开头的机构学习小学奥数的时候,我就参加了他们搞的一个小学奥数出题活动,往里面扔了一道有五辆车乱飞的行程问题骗老师把它吃了,居然还得了奖。所以在 2022 年拿下七钩前不久,感受到实力逐渐变强的我就一直琢磨着出一场公开赛。

于是在经历了一些晚自习的碎片化思考后,我得到了四个题作为 J 组模拟赛。其中两个 too standard 根本就不是题,一个是大模拟,还有一个就是烟花的前体(大概就是这道题没有询问的版本),我把它放在了 D 的位置。

我把这套题自豪地拿给 @StayAlone 阅读,并成功吸引了其他人的注意,其中包括获得了 IOI2026 Au 的香蕉。香蕉直接打开 D 锐评这是砂玻题,获得了我们的膜拜。

其他人认为我们应当建立出题组,为小朋友准备一套 J 组模拟赛。可以说这也是 Y 中学最早的互测。在 SA 毙掉我的两道题之后,经过一段时间的努力,我们准备好了 未完成的约定 作为 A,一道板子作为 B,原来的大模拟作为 C,以及烟花的前体作为 D。

尽管教练劝阻我们将训练时间投身于出题,我们还是努力地完成了这套题目。

这是当时非常中二的头图(摄影来自我的一个当时很好的朋友,转眼间我已经和她走散了),我今天才发现这玩意居然叫 SAOI,而当时 SA 根本还没有改成现在的 id。

我们心满意足地将这套题交给了教练,然后,然后就石沉大海了。根本没有任何人考了这套题。

比赛石沉大海之后,我们很快就淡忘了它,投身于准备 CSP 2022 当中。在秋天的慢悠悠的时间中,我尝试对烟花前体进行修改,使得它变得更加困难和有趣。

当时教练组织了每天晚上竞赛课下课后夜跑的活动。夜跑的时候是难得的可以抛开一切去思考自己想思考的事情的时候。在某次夜跑的过程中,我忽然想到了烟花可以怎样修改:首先将限制从“至多”改成了“恰好”也是可以做的,接着我想到了现在的两个询问,因为我有一种强烈的预感,这一定是可做的。

我坚信这道题终于有题的样子了,兴奋地开始推进这道题的工程进度。然而当我发现要计算上指标求和时却遇到了困难。在没有 AI 的时代。我不得不发了一个帖子。当时并不知道我在做什么的 SA 使用整数裂项得到了上指标求和。后来我内部公开了烟花的做法,我们几个人从此知道了这个公式,以至于烟花本体出出来之后的很长一段时间我们都用烟花来称呼上指标求和公式。现在看来,当时提出使用莫队做上指标求和的 xde 早已进集,令人感到时间荏苒。

2022 年的冬天,我们在家里度过了一段快乐与痛苦交织的时光。到了第二年春天,我们都改变了很多,逐渐有了脱产的 OIer 该有的形状,教练也不再常说我们“业余”了。当然后来还是说过我好几次。

在第二年春天 whk 的一段时间里,我在自习课上偶然得到 DTTM,@Hooch 在去机房路上得到 三班不一般 实现了发明 dp 整体转移的壮举之后,公开赛再次提上了我们的日程。删除掉不是题的板子和大模拟之后,SA 又放入了一道他心爱的哈希题目(也即 人生如树,后来发现这道题等价于 Misha and LCP on Tree,好笑的是我高中重做后者时被数据卡得红温)。

我们对五道题目按照当时我们的实力进行了排序,完全闻所未闻的整体转移 dp 自然被放到了最后,而因为我们认为应该按照证明难度排序,DTTM 则被换到了 B。烟花在我的强烈建议下被放到了 C,现在看来是十分正确的。

我们尝试寻找扶苏给我们的比赛添加 rated,然而并没有得到扶苏的回复。原因是当时洛谷公开赛审核机制正在改革,我们不幸赶上了扶苏向 E_Space 过渡的时期。

在被我邪恶地武力统一题目背景之后,在决定要献给不幸被过河卒击倒的 lazytag 和 Sword 学长(当然另外两外学长也很可惜很值得敬佩,只是当时我们和 lazytag 和 Sword 比较熟悉)之后,Y 中学历史上第一场洛谷公开赛就让我们来举办吧!DBOI R1,举办吧!

EP02. 架子鼓可以站 C:夏天不会等待我

2024 年春夏的一段时间我追星追得魔怔,于是萌生了为 SHUN 举办一场比赛的想法。对当时没有开智的我来说这是非常特别的一种方式,同时对一直想举办一场个人公开赛的我来说很有吸引力。

于是从 3 月开始我就开始准备题目。当时其实是 Hch 偶然得到了鼓 C 这个题,但他的做法并没有做明白。我为了凑齐一场公开赛,于是用 200 元(伏笔)购买了这道题,并在没有什么水平的情况下想出了一个 7K 长度的 std,成功修补好了他的做法。

不料,六月的时候一切都变了。我无力去陈述那段时间我的痛苦和挣扎,我想大多数 OIer 也难以和我共情,所以按下不提。总之经过一段时间的挣扎,想要从中抽离却又无法,我还是决定要举办这场 DBOI / SpOI。在一片骂声中,DBOI R2 还算是成功举办了,题目被我净化掉背景之后加入了主题库。

鼓 C 这道题的故事貌似就此结束了。由于没有参与比赛准备的 @LPhang,SA,和 @Zelotz 费了很大力气讨论才通过这道题,从此“把一棵树上划分成两个连通块使得直径和最大”这个典题被我们称为“鼓 C”(而不是更多人熟知的 Chocolate Spree)。后来我们遇到了很多次转化到最后就是写这个典题,每次我们都会哀嚎又要写一遍鼓 C 了,然而身体诚实地开始复制鼓 C 的代码。

然而并没有。11 月我们去到了 LCA 营集训。某天模拟赛刚开打 5 分钟,从 2C 开始打 Div.1 的拿了米大哥就在群里喊:

这不是 Shunpower 暑假公开赛的题吗?

我一看还真是,这下乐了。比 3 月更聪明的我想到了这个题的正确写法,在模拟赛场上重构 std,并且本地还有全部的数据;而第一次做这道题的 @hzjoiineg 则展现了智商的优越,以相当快的速度通过了这道题。最后我们以及很多人都过了,只有悲惨的 @tongzhenxuan 大哥被 LCA 坑了一手,他的代码通过且仅通过了 LCA 下发作为大样例的 #22。

似乎从此以后这道题就成为了 LCA 营的常驻,2025 年的 10 月,又一批提交和题解涌现在鼓 C 上。

夏天不会等待我。2024 年的夏天迅速远去,我们都进入了高中。从此以后,貌似真的就是 Senior OIer 了呢。

EP03. Time to Heal:时间治愈

在 NOIP2024 的 traverse 中胡出完全一团乱的容斥,并因为没有删掉菊花的错误代数式挂 12 分,以至于在 1h 过两题的超级顺风局下打出了 NOIP 二等奖(并且成为了一辈子的遗憾)之后,我随着大家一起抱憾回归了 whk。

其实我们心里都清楚,熬过一个半月 50 节课 per week 的 whk 补习之后,我们就能回到机房继续为 THUWC 和 WC 停课。但是这段时间终究还是难熬的。于是我又开始不免在闲暇的时刻思考是否可以有一些灵感。或许是前往食堂的路上,或许是在午睡前躺在床上看着天花板的那十分钟。

在某一天中午睡觉前,我坐在床上酝酿着睡意,跟随着耳机里的音乐寻找灵感。忽然听到某一句(甚至已经忘记是到底是哪一句了),我的脑海中就出现了一棵树,树上挂着两条路径,有的点交叉着,有的点离散着。

我想,这是因为我一直对 [NOI2020] 命运 里那个比喻耿耿于怀(伏笔)。人生就像一棵树,我们和有的人交汇,和有的人暂别,和有的人错过。我可能恰恰是因为太过感性,以至于能感受到树和树上路径的那种感觉而能出出来如此多的树上操作题。

对着脑海中出现的两条像同源染色体上的姐妹染色单体一般(?)交叉而松散的路径,我立即想到了这两条路径的 LCS,然后想到了点双,并且发现求最小字典序的 LCS 貌似是一道很有趣的点双题,从而得到了将 k-TS 等同于 LCS,并且 \mathcal O(nq) 的版本的 Time to Heal。

我至今仍然记得,当我意识到我得到了一道题的时候,我在床上激动地拍着床板,对面的 whk 同学疑惑地看着我。还有 OI 痴

来不及等到起床了!冒着被宿管阿姨扣分的风险,我跑去找对面宿舍的 lph 讨论正确性。lph 敏锐地指出了这个东西不一定是 LCS,但一定是极长 CS。随后我将问题改为了 k-TS 的形状,在那天晚上回家之后就想完了所有的细节。

第二天早上,我把题解打印了出来,在中午和 lph 一起吃饭的时候就讨论了起来圆方树和点双。旁边的小朋友听到我俩讨论圆方树小声讨论“圆方树,是信竞吧”“学信竞的怎么吃饭都在讨论题目”。 我们俩一直从餐桌上讨论到宿舍,当 lph 终于理解的时候,我好像发现了什么!

这个题如果改成输出哈希,是不是可以 \operatorname{polylog} 啊?

笛卡尔树、倍增、二分……完整的算法流程的逐渐在我脑海中展开。这一天里,我都在思考这个算法的细节。晚上回到家时我又在电脑前工作了许久写出了大致的流程,第二天又花了接近一个中午给 lph 讲懂了 \mathcal O((n+q)\log n) 的做法。lph 只是露出他标志性的苦笑说,“这也太难写了吧。”

这也太难写了吧。在 WC2025 的自习室,我鼓起勇气花两个完整的时间写出了这题的 \mathcal O(nq) 并过了拍并翘掉了 Kubic 和 Flowerletter 的课。当我和 SA 吃完饭回到自习室,我看到 Accepted on test 10000. 的那一刻,码长定格在 8.33K,我知道折磨暂时可以结束了。

再次讨论这道题已经是高二停课以后了。某天上全天自习,但已经补完所有模拟赛题而无题可做的我选择来挑战这道题的 \mathcal O((n+q)\log n)。我从早上写到下午,中途好几次遇到困难的细节还惶恐地以为自己假题了,但幸好仔细想了一下又成功修好了。到了晚上,我的 cph 已经承受了 20 多组对拍出来的 Hack 数据(最后它们变成了这道题的 20 个样例),而它看上去终于过拍了,码长在 15.54KB。

整个这一周我一直不间断开启着这道题的对拍,并因此阻止任何人走的时候关闭机房电闸。好几次我在做其他题的时候被打断。幸运的是,在修复了一两个小错误之后就顺利地过了五十万组拍,码长定格在 16.18KB。

我兴奋地告诉 lph,我真的写出来了。我真的写出来了。

但是我们的验题人 SA 似乎并不高兴。 SA 于是开启了为期半周的搏斗。SA 通过他特有的在草稿本上练字和扣手的方式想清楚这道题该怎么写更方便之后,他要求我必须把这道题改成有交换律的运算而不是哈希,否则他将拒绝写这道题。迫不得已,我只能含泪删除了自己的 6KB 哈希代码,改成了现在的求和。在艰苦的搏斗之后,SA 终于把他 7KB 的代码成功过拍。

造数据的过程非常痛苦。为了卡掉所有的细节,生成器中几乎复合了一个 std,使得代码变得完全不可读。但我因为执念,仍然在沈阳开着暖气的房间里艰难完成了工作,又在后来的 WC 集训加强了数据 一开始随机造的笛卡尔树树高全是 log 大小的。

这道题虽然出出来了,但我们一直没有合适的地方投它。无论是 R3(核桃 CSP-J/S 模拟赛)还是 R5(Codeforces Round),显然都不合适。事情就这样一直拖到了我们被清仓甩卖退役之后,WC2026 之前我认为我们出了足够多的不是题的东西了,干脆赶紧搞一场 rated 公开赛扔出去好了。于是我组好了 DBOI R-(-1),让 irris 吃了一遍之后还算是顺利举办了,除了砂玻 SA 造数据造错一个点。

DBOI R-(-1) 举办之后不久,我的 OI 生涯也随着省选的结束而完全在法定意义上结束了,剩下的就是高三的 tough time。至于没有办的两场 Round,就让它静静排着队吧。

八月份的一天,考入同济的青白告诉我 Time to Heal 成为了他们 ACM 队的“keep 一下”训练题。

那一瞬我忽然感受到一条过去的琴弦被拨动,弹奏出治愈的音符。

EP04. 卫冕:雨会顺流而下

2025 年寒假我们去南京集训结识了核桃之后,很长一段时间我们都在核桃的公开赛中捞钱。谁不喜欢打几个题写两个暴力就能一周赚 80 块钱呢? 到了六月的时候,根据 DBOI 每年一场的传统,我提议开始准备又一年的 DBOI Round,教练则建议我们通过核桃赚钱。

在确认如果我们可以提供 8 道题目就能获得高达 6600 元的工资之后,我们便从零开始出题筹备 DBOI R3。我首先贡献出了自己的烂题 Worth It,再从 @WaterSun 那里要了一个 J 组 T4,这道题在南京出好的时候甚至让 yzc 验了题,接下来我们还需要一个合适的 J 组 T3 和 S 组的后三题。

接下来就是智慧的大脑开始展示天赋的时候。hzj 率先展示人类智慧给出了一道 CNOI 风格的好玩的构造题,我认为很适合作为难度类似于消消乐的 S 组 T2。Zlz 也开始展示自己的 Ad-hoc 水平,给出了一道直观比较好想但仔细想起来则思维链比较长的题目。后来在八月的成外培训中,草八牛意外讲到了一道和 Zlz 这道题目相像的题目,大概是一个等价表述。还记得我们几人会心一笑,故作感叹着 Zlz 的超前。

接下来就是寻找合适的 J 组 T3 和 S 组 T4。为了挣到更多的钱,我开始思考如何出一道合适的 J 组 T3。一天下着小雨,我坐在回家的公交车上,期待着灵感降临。听着歌侧头看窗外雨滴在车窗上滑落,我忽然开始刻画雨滴下落的轨迹。它们一边下滑,一边向左或向右移动。如果这是在一个棋盘里面呢?如果棋盘里面有一些区间呢?

于是,我得到了卫冕。我快速意识到这本质上和一道臭名昭著的 AT 题目相像——直接移动到左端点或者右端点总是不劣的。接下来,我开始思考是否可以套一些皮。

我想到这个左右移动的结构可以看成是在对变量加减法。能不能把减法给消掉呢?模意义会怎么样?如果把做法放在模意义下,结论依然是成立的。那么,就这样吧!

因为出现了模意义,感到整体 dp 好像有点困难的我没有去思考太多能否把复杂度优化。不过考虑到这是 J 组 T3,我还是心满意足地接纳了。

后来比赛组好之后,hzj 开始验这道题。经过一段时间的思考,hzj 告诉我,他想到了一个 \mathcal O(n\log n) 的算法。原来整体 dp 是我太愚蠢了,明显只需要记录区间左端点和右端点处的答案,然后做 4 个转移就好。我一听就不想写 hzj 没多久就写了出来。而审核员也同意了我们在 J 组为此添加一个 5 分的 Subtask 的请求,这使得 lph 在讲题的时候不得不为这 5 分连连道歉。

遗憾的是,这道题在最后的比赛并没有多少人通过。可能是因为比赛时间恰好撞了 NOI,而大家也都不太有耐心去为了 AK J 组写这么复杂的 5 分。(

EP05. Time Machine:音乐会等待我

在获得卫冕之后,如何对着竹子格物获得一个 S 组 T4 变成了最大的问题。我提议反正核桃质量不高,可以使用 Time to Heal 或者 SA 的巨大根号数据结构题,分别被 lph 和 Hch 制止。

那段时间我偶然听到了 Time Machine 这首歌,让我想起了过去的一段天真的幸福的时光。我对喜欢的东西一直都是用到腻为止的态度,于是那段时间我一直单曲循环这首歌,并且成功把它听腻了。

某天下午放学吃完晚饭,我一直戴着耳机循环这首歌。回到机房,因为还没有上课,我打算再听一会。面对着空白的白板,我拿起了白板笔,然后这个动作就成为了接下来半年我开始长考的标准动作,试图像 Time to Heal 一样在歌里找到题目的灵感。

恰好这个时候 SA 回来了,正好我戴耳机的一侧是靠门的那一侧,于是他一如既往地挖苦这个中二样子的我:

你这样能出出来题我吃

我没理他。10 分钟后,我感受到联想和感受的力量开始迸发。如果时间机器能删掉一条回忆、一种选择呢?如果我能删掉一棵树上的一条链呢?

我需要形式化。具体怎么删呢。诶,如果我能删掉一棵树上的一条链,留下 LCA,把所有链上外挂的东西全部挂到 LCA 上呢?

容易想到一个思路是最小化把树删空需要的次数。于是,我得到了 Time Machine 的前体。我构思了一个复杂的树形背包 dp 解决这道题,似乎勉强可以作为 S 组 T4。我刚坐下来开始写题面,恰好 Hch 回来了,他看到我在白板上画的操作图询问我这道题是什么。我如实告诉了他,而他认为树形背包 dp 实在是又难写又太愚蠢了。

我只能无奈地苦笑。Hch 继续注视着白板。我刚写完题目描述,他突然指出:

可以把删链看成边覆盖啊。

思路打开!接下来的问题就是怎么用最少的链边覆盖整棵树。此时我也开始发力,我想到了转置过来,计数用 k 条链可以覆盖多少个点。想到这里我几乎是惊呼出来的,因为这恰好是我刚做过的 [POI 2006] MET-Subway。

波兰人还在发力!

这道题的结构恰好支持我们进行动态维护,于是显然可以加强成对所有剩余树的大小都输出答案,双指针就好了。这下这就是实至名归的优美的 S 组 T4 了,也就是最终版本的 Time Machine(其实难度还是有点不够,但是被核桃接受了)。

SA 对我真的可以这样出出来题表示无奈。他还对为什么我和 Hch 这么会出树上操作题表示无奈。

后来我就投身于造这道题的数据中。贪心题真的一点都不好造。有一个周末大家都走了,留下我在机房造这道题,没想到遇到了回校招生的 lazytag 学长。感觉明明他们还没有离开很久,但是机房却已经重新装修,我也从三机房的小孩变成了四机房的主力,迎来了自己的 last year。他问我一个人留在机房是在做什么,我说正在造自己的原创题,他询问我是否可以拍一张照片,我当然欣然同意了。

lazytag 的突然出现让我想起了两年前实力不足的我们为了 DTTM 的证明不断叨扰他的时候。其实那个时候他说的方法我们根本就没有听懂,但还是抄下来写到了题解里面。这一切仿佛就还在昨天。

第二天 lazytag 又来了一次,告诉我他已经会做了,并且还问我这是否是一首歌的名字,他也认为这首歌很好听。令人遗憾的是他没有像 sword 一样和我们进行较长的交谈。

不久后,我和 Hch 分别出出来了 J 组 T1 T2。之后没有题的 lph 揽下了 J 组讲题的工作,我顺理成章地成为了 S 组讲题人其实只是想找个理由学 beamer,我们成功在成外举办了 DBOI R3。印象中貌似还是 2025 年核桃的第一场 CSP-J/S 模拟赛,一来就给了大家一个下马威。

还记得因为成外封闭式管理,我们不得不在讲题当天联系教练获得电脑,然后在办公室讲题。坐在正儿八经给我们讲课的集训队旁边讲题真是太惶恐了。不过讲题还是非常顺利地结束了。唯一的一点小插曲是 TomAnderson 质问我 lph 是否没有认真讲 J 组 T1,甚至代码都没有展示,但是 lph 对此矢口否认,不知道是不是 TomAnderson 很信任我们,也就这样过去了。(

讲完题那天晚上我们就得到了 6600 元的工资。随着我的一声招呼,线上的 WaterSun,和线下的我们,轰轰烈烈地分起了工资。除了没有题的 SA 有些闷闷不乐,大家都很开心。这还是我们第一次通过 OI 赚到了钱,是真的可以拿去做自己喜欢的事情的自己的钱。SA 其实早在 LCA 营的时候就通过搬运一套模拟赛一个人独享了几大千。

不过没关系,SA 的甜头在后面呢。

这笔钱里我拿走了两千多,它们最后正如我六年级时的梦想一样变成了一张演唱会门票。我至今仍记得在重庆国博的 S1 场馆里,我坐在第二排的一号,相机里的脸终于清晰。

EP06. Simons and Diophantus Equation:milo 为什么是神?

成外培训结束后,我们几乎无缝衔接去了中山的双鸭山中山纪念中学。在纪中,我们被拉去听了很多的课,其中就包括重新学习莫比乌斯反演。

显然我当时认为我精通莫比乌斯反演。于是在佯装听课的时候,我思考起了一个之前的 idea:

给定一个序列 {a_n},求有多少对 (i,j,k) 使得 \gcd(a_i\oplus a_j,a_j\oplus a_k)|m。

这也就是 Simons and Diophantus Equation 前体。当时我的表述就已经是套了一层 Bezout 定理的形状了,这也一直留存到了最后这道题被出出来。

由于我记得当时我是因为没做出来这道题而放弃了这个 idea,我决定先尝试把这个序列 a 删掉的弱化版,也就是现在的 Simons and Diophantus Equation。经过和巨大式子一番搏斗,我获得了一个 \mathcal O(n\sqrt n\log n) 的做法。我把这道题告诉 SA,SA 锐评道:“还跑不过平方算法。”

无奈,接下来的好几天我都尝试消除掉这个 \log 因子,使得这个题变得更优美。中途我一度认为二进制分解或者文化课 trick 可以拯救这道题,但在细想之后都倒闭了。最终我不得不让 Hch 启动了当时被视为超人的 Claude,它思考了很久之后得到了一个类似于对整除分块进行逐块处理的单根号做法,但是非常难写。

最终我提议求助学长 @cool_milo。milo 经过了一段时间的思考,我印象当中还包括重新学习莫比乌斯反演,给我发送了一条改变这道题命运的信息:

这个题可以单 log 吧

Y 中学永垂不朽的队长还在发力。我和 SA 急切地想要知道怎么做到单 \log,于是我们向 milo 抛射了一系列语气词和询问请求。

milo 指出应该是双 \log。随后他向我们大概解释了做法,前面和这道题现在的做法一致,但是最后的计数部分他的 Trie 操作非常难以理解。

后来 milo 告诉我们,这道题做法中转置的部分恰好与 [省选联考 2024] 魔法手杖 相同。在做我们出的这道题的时候,他感受到一些颤动。如果你阅读过 milo 的回忆录,就会知道魔法手杖终结了他的 OI 生涯,让 Y 中学历史上第一块 WC 金牌毫无征兆,同时也不可思议地倒在了省选。听到 milo 的话我们都很难过。但印象中这道题被解决后不久,milo 就重做了魔法手杖,战胜了自己的心魔。

在理解了前面的部分并对 milo 的抽象 Trie 操作感到无力之后,我决定要在最后的计数部分提出自己的做法。我意识到最后其实可以通过扫两遍 trick 解决互相贡献的问题,对每个位进行朴素的线段树操作就能做到三个 \log 的复杂度。随后我又想到了区间本质上只有两种,其中结构比较糟糕的区间数量是 \mathcal O(1) 的,两头合在一起就是两个 \log!我用 BIT 实现了这个算法,得到了这道题的第一个 std。

lph 意外地主动要验这道题。在给他讲懂做法之后,他突然问我:

为啥要写树状数组,这个不是在 Trie 上操作就好了吗?

我恍然大悟,把一开始的线段树换成 Trie,就可以在树上跳跃从而灵活地按位操作,避免了每一位都要产生 \mathcal O(\log n) 的代价。于是,我们得到了第二个算法,以及 lph 的 std。

在和 Hch 和 SA 交流之后,我提议因为这道题风格非常 CF,而且难度比较高,我们或许可以尝试举办 DBOI Codeforces Round,把这道题作为最后一题。于是我们把出题组所有的题都扔进了 Proposals,其中还包括学弟 @Yealin 出的一道被 SA 爆标两次的思维题。

很明显我们并没有准备好的 2A 和 2B。于是在夜晚窜寝的过程中我拉着 SA 出了海量的 2A 和 2B。其中最臭名昭著的题目就是最后被 Error_Yuan 钦定的 2B Simons and Cakes for Success。当时 SA 正在洗澡,我在外面疯狂输出若至题,其中就包括这道答案显然是 \prod p_i 的题。抱着半开玩笑的心态,我们把这些题全部挂上了 Proposals,结果没想到其中这道题居然就过了,气得 SA 非常跳脚。

从中山回到重庆后不久,9 月初,Error_Yuan 开始接手审核我们的比赛,我们和他五个月的纠缠就此拉开帷幕。 在通过了最终的 B(蛋糕题)和 G(丢番图方程)以及一道原题、一道假题、一道后来被毙掉的题之后,我们进入了 discord 阶段。

然而题目出现了大量的问题。同时由于不熟练 polygon,工作开展非常低效。我常常需要一整天才能造好一道题。幸运的是,在 milo 的想象力的帮助下,我们重新获得了一些合适的题目,在 NOIP 之前进入了 test 阶段。milo 利用自己的人脉邀请了他的队友 10o 和 Y 中学近 10 年来唯一的省队 6hx。6hx 再次响应了他的刻板印象,在这道题写出了一份我们看不懂但跑得飞快的代码。

通过浏览 6hx 的代码,我恍然大悟这道题的本质是求两组区间的交,而区间交可以直接排序之后双指针,并不需要任何数据结构。我由此断言 6hx 的代码是朴素排序的 \mathcal O(m\ln m\log m\log\log m) 的,并写入了 Editorial。最终这道题也因此有了 milo、lph、6hx 和我一共四个做法。在 Editorial 一栏写 4 个 id 真是太魔怔了。

比赛结束后,有人询问 6hx 的做法是否和 jiangly 本质相同。很明显我并没有完全 get 6hx 的算法细节,所以我直接贴了代码原文。而对方告诉我 6hx 的代码使用了特别的实现方式实现了和 Trie 类似的操作来排序,所以没有 \log\log n 因子。6hx 又一次响应了他的刻板印象:使用特别的的实现方式。

讨论看似到这里就结束了。直到 2026 年 10 月,偶然 LA 群在讨论 01Trie 代替线段树的技巧。群友说给数排序本质上就是建立了 01Trie,只不过是拍平在序列上了。我和 milo 才明白原来 6hx 的办法是这样的。6hx 到底看得有多远?

EP07. Nobody Tells:我真的会出 Interaction 吗?

给 CF 出题的过程并不是一帆风顺的。中途换题的过程中我们非常痛苦地硬憋了一些题出来,最后这些题绝大部分都没有进入 CF,反而是进入了 DBOI R-(-1),怎么会是呢。其中 SA 的一个 idea 云剪贴板立了大功。通过浏览他的云剪贴板,我知道了一个结论:对于 Fibonacci 数列 F_i,我们有 F_i^2-F_{i-1}F_{i+1}=(-1)^i。虽然这好像是一个经典结论,但最初是 SA 自己发现的。注意力太惊人了。

于是我开始思考是否可以用这个结论出一道题。我注意到,如果改成广义 Fibonacci 数列,这个结论依然是成立的,只不过是右边变成了 (-q)^i。显然还需要加上取模。

加上取模之后,我很快在右边观察到了费马小定理,于是以为自己得到了一个可以用 3 次询问确定 p,q 的算法,因为我当时自信地认为 F_{M-2} 不可能为 0。

我给这道题赋予了我当时非常爱听的小酷的一首歌,也就是《Nobody Tells》作为题目背景。现在看来这首歌恰好预言了我后来的生活。从一种生活中抽离,到另一种生活,到另一种生活。害怕无人知晓,希望无人知晓。

抱歉我没能在今年交上满意的答卷 / 写过的豪言壮语何时才能兑现呢

我和 SA 把这道题扔给了代表着机房智商高地的剩下四个人。他们讨论着做了一个小时也没有做出来,看到题解之后直接气笑了。

我们把这道题投给 CF,收获了 Error_Yuan“不用看了,too mathy”的评价。lph 指出这道题根本就不是题,应该放进我们的不是题的题单(最后变成了 DBOI R-(-1))里。

尽管使用的时间遥遥无期,SA 还是尽量把自己在役的时间投入到造题中。在造题的时候,他告诉我 F_{M-2} 可以为 0。我有些疲于去思考这种情况下的性质,但是我发现改成输出两种答案就可以用原来的做法填补掉这个问题。于是现在的 Nobody Tells 就这样出来了。

在 R-(-1) 举办前夕,我突然心血来潮,认为把限制改为 M^2 可以有效地混淆视听,掩盖这道题的做法。然而我完全忽略了扩大范围可能会有更简单的做法。于是这道我们想象中的 Ad-hoc 对脑电波难题在比赛里被过穿了,也有很多人找到了可以唯一确定答案的方法。

幸运的是,cz 接受了比赛结束后将原版也加入主题库的请求,我们的这一巧思得以转化为一道真正的题目独立留存,SA 也从他的 idea 剪贴板中删掉了这一行。

我总是喜欢去欣赏自己出的题目,看看是否有人把它们搬到了模拟赛,或者单纯练习也好。我希望我的题目可以焕发着生机,可以影响一代又一代 OIer,“身死而道长存”。偶然翻阅 Nobody Tells 的提交记录,发现已经有人完成了我们的遗愿,找到了可以唯一确定答案的方法,但遗憾的是没有人提交题解。

EP08. 发迹:只是一个直觉

Hch 虽然所有题都不幸被毙了,但在办 CF 的过程中还是给了我们莫大的帮助。他前前后后提出了一个 A,一个 D 的前体和一个 E。最后 A 因为太难被毙了,E 因为我有了一道更好的题被毙了,那个 D 的前体则变成了发迹。

11 月的某个下午我们正在为缺失一个 D 而焦头烂额(milo 获得 Simons and Beating Peaks 是在我们从沈阳打完 Regional 会重庆的时候)。Hch 突然提出了发迹的那个 Observation,并询问是否能改编成一个题目。直觉告诉我应该可以数数,于是我想了一下说:“应该可以数数。”然后走到机房前面的希沃白板开始推导组合式。

非常幸运,我没有走上容斥的错误道路。我直接妙手偶得,写出了这道题最简洁的两个组合乘起来的式子,然后声称我们得到了 \mathcal O(n^2) 算法。

Hch 和 SA 都认为听上去是道不错的题。于是我坐下来开始编写题目描述。可是我越看着那个式子越有一种冲动:真的不能再快一点吗?真的不能吗?

我凝视着组合数上下的 c。它是 c_i 而不是 i。

我意识到,c 是美好的。c 只有根号种!所以我们的算法其实是 \mathcal O(n) 的!Hch 催促着我赶快把这道题投到 CF。然而,Error_Yuan 认为这道题比较套路(还是什么,印象有点淡化了),于是把这道题毙了。

SA 认为这道题非常有 CNOI 风格,于是这道题就被我组进了 DBOI R6 大月赛,随之一直拖到了省选后。省选后的一天下午因为教师运动会放假,我选择来机房造这道题,还因此见到了 Y 中学的新教练。联赛前的我仿佛以为自己并不会在这些题之前退役,所以题解只写了五行,也没有任何式子,我不得不重新推导组合。尽管我知道当初我看了一眼就能写出来,但对于离开 OI 数个月的我来说这早已远不能及。我先在容斥上花费了大量的时间但完全没有结果,最后转向组合意义才重新得到了这道题的做法,并且卡在打迟到之前顺利造了出来。关上电脑的那一刻,我感到自己和 Y 中学机房就此两别了,以后不会再有这样的机会了。

然而 DBOI R6 的审核工作被一拖再拖。最终拖到了暑假后的 10 月,压到了高三的我们几乎是仅有的最后的假期。等待着比赛举办的那些日子里我感到前所未有的轻松和幸福,人生有盼头就是如此吧。

EP09. Simons and Dividing the Rhythm:遗失在黑板上的证明

NOIP 之前我报名了洛谷的 NOIP 冲刺计划,从此每天开始都有海量的题可以做了,并且都是让我做起来很舒服的 CNOI 风格题,也终于告别神秘的模拟赛了。

有一天我在 dp 题单里面做到了 [USACO20DEC] Bovine Genetics G,但我没看到“在所有连续相同字符之间的位置将当前基因组切开”的限制,而是以为可以自由决定。我很快通过经验和直觉想到了如果钦定到没有 border 的分割,那么可能是双射的,并且胡了一个错误的 fail 树算法来解决 10^5 的数据范围。感叹着这题真有趣的同时,我写完了简短的 \mathcal O(n^2)“暴力”代码。结果过不了样例。这时候我才意识到读错题了,这题根本没有这么精妙,但我同时似乎出了一道精妙的题出来。

因为我只用了 10 分钟就会做了,我一直以为这道题并不是一道难题(实际上也确实不是)。退役之后还淡忘了它的存在,没有考虑尝试把它放到 CF 上。直到我们被 Error_Yuan 的换题请求逼疯了,12 月中旬的时候我想起来还有这么个题可以试试,于是便要求 milo 开始看这个题。但是因为各种原因,最终拖到了一月份。

milo 指出首先需要证明这个结论,他感受不到正确性。投身 whk 两个月的我难道还能写出证明?我真的能。我随手拿了一张草稿纸画了两个串,标上 border,划去相同的部分……总之轻松完成了反证。遗憾的是,当时拍照发给 milo 的照片已经找不到了。

第二天的自习课我将这道题介绍给了 ph 和 hzj,但他们显然疲于思考。我们几个人中也许只有我忘不掉 OI。因为我们几个人脱离原班补课,所以可以在自习时摸鱼,不想做作业的我选择在黑板上写下了这道题结论的证明。不过 ph 和 hzj 应该到最后擦掉的时候也没有欣赏。现在看来,当时写的黑底白字好像悼文,我的 OI 真的要在 WC 之后结束了。

好在这道题终于获得了 Error_Yuan 和 irris 的接纳,变成了最终的 E 题。尽管 Error_Yuan 希望再调整一下 D 和 E 的难度,但是在我彻底失去耐心的催促下,我们还是踩着 2 月的尾声举办了属于我们的 Codeforces Round 1083 (Div.2)。因为 milo 恰好在寒假回到了 Y 中学讲课,我恰好 WC 停课,我们幸运地找到了一个时间拍摄了一张合照。从开始为这场比赛出题,我们就计议要在 CF 主页放上出题人合影。中途我们多次忧虑上 whk 的 SA,要去 WC 的我,以及远在 THU 的 milo 到底能否拍摄一张合照,还好在某一天紧张的晚饭时间,大家真的又聚在一起了。遗憾的是曾经的教练已经不在这里了。物是人非,什么都没有改变,什么都改变了。

但不幸的是,这道题和于 2025 年年底举办的 GDKOI ACM 撞题了。这也是我唯一一次因为公开题目没来得及被别人抢占先机。不过还好这道题当时没有公开,对比赛的公平性影响不大,留存的聊天记录和印象使我可以证明自己没有搬题。也还算是没有出锅了。

EP10. 25HRS:让草稿纸滑动起来吧!

到了五月,大家好像已经习惯了从 OI 中抽离的生活。日复一日的考试、复习、作业、挫败。但只有我仿佛因为还在负责着这些场所以总是无法和 OI 撇清关系。而 OI 好像也变成了一种特效药,或者情绪稳定药,在我特别需要的时候使我可以回到一个安静的独属于我自己的地方。我常常背一些题拿到考前辅导的时候去做,抵消掉烦躁而漫长的复习时间。

有时我也会试着出题。翻开一页新的草稿纸,画出一棵树,尝试找到一个合适的操作,刻画结构试图把它变成一个题。通常这种活动都因为我遗失了打 OI 的时候的经验和想象力而已失败告终,但有一个晚上,我成功了。

我枚举到了将子树挂到兄弟上的操作。不难发现这样一直操作下去就会变成一条链。于是我开始思考能不能数有多少种最终链的形态。通过刻画,我发现链上的点的顺序需要满足一定条件,而条件就是树拓扑排序的条件,所以本质上生成链就是在拓扑排序,因此只需要再结合背包,就可以计数了。这也就是没有出现在比赛中的 25HRS (Easy Version)。

但我同时想到,生成链的最小操作次数和经过 1 的最长链长度有关。我不愿意放弃这个美好的结论。能不能把两者结合一下呢?并且数链的形态还是太不优美了,能不能数生成链的操作方案数?为了结合结论,再钦定成最少操作次数吧,能不能数最少生成次数生成链的操作方案数?

于是,我得到了 25HRS。但是我完全没有看出来向链融合的结果,所以我并不会做这道题。下课之后,我告诉了 hzj Easy Version,并希望他想想 Hard Version。没想到仅仅是介绍题意就花费了一个课间,他承诺我下节课会想一下,下个课间告诉我。

hzj 展示了自己用之不竭的想象力。他下课之后告诉我,他 10 分钟就发现了这个可以刻画成是向链融合,所以钦定完最长链之后外面的点都在拓扑排序。我对这种刻画方式感到惊讶,膜拜 hzj 的思维水平的同时意识到我得到了一道好题。回家之后我立即整理了题解,把题目加强到了从 1 分叉的链也可以数,并由此留下了忘记乘 2^{deg_1-2} 的大坑。

之后 DBOI R6 开始审核。因为一道题被 cyj 毙掉导致题目向前平移,这道题也就被换了上来变成了 E。再之后就是为了尽快举办 DBOI R6,milo 动用了他在茶园的关系找 Tony2 审核,Tony2 认为我们的题目不足以成为大月赛,于是删除掉一道简单题之后,这道题变成了最终的 DBOI R6 小月赛的 D。

为了赶在国庆假期结束前举办 R6,同时因为高三的我们难以工作,milo 便承担了大多数的工作(再次感谢我最钦佩的学长 milo)。其中就包括所有的验题工作。milo 在与 25HRS 艰难搏斗“几百年”之后终于犯了和我一样的错误并导致比赛出锅 终于想到了 hzj 10 分钟就想完的东西 终于战胜了。他对这道题目盛赞不已,甚至认为这道题目应该换掉臭名昭著的 [NOI2026] 布丁 进入今年 NOI。虽然我觉得有点过誉,不过我也意识到这道题的组合结构原来真的是很漂亮的东西,曾经一直忽略了这种美。milo 还因此在这段时间里问了我好几次为什么我有远超 OI 水平的出题天赋,其实我也不太明白。

也许是因为,我真的能感受到命运像树一样展开。我一不小心剪断了一根枝条,一个生活就这样被接到了我面前,使我措不及防。THUWC2025 如此,NOIP2025 如此,我生命中的许多事情都如此。

后记

My destiny endows me with loneliness.

My problems reflect my loneliness.

My friends save me from loneliness.