欣媛小姐的编程之路

· · 休闲·娱乐

(在我常常追忆过去和休闲娱乐中想了大半天投给了休闲娱乐)

该小说根据作者学习编程与 OI 经历改编,情节与真实情况不完全相同。

存在少量超自然幻想内容,请勿当真。

以下地名、校名、人名及考号均为虚构,如有雷同纯属巧合。

001 序言

在那遥远的冰雪世界,有一位淑雅美媛。

她无比高冷而优雅,是天上一位魔仙。

她的名字太长而复杂,不便于完整书写。

如果需要一个称呼,请叫她欣媛小姐。

欣媛下人间芳龄十八,正值美好花样年华。

湖边溪畔闲情逸致,一城山水览于眼下。

在校本是文化课选手,却选择登上信竞舞台。

她为何做出了这样的选择?且听她娓娓道来。

002 请输入一个时间:200906

2020 年 9 月 6 日,康州依旧夏日炎炎。13 岁的欣媛小姐收到课本之后,便打开她最喜欢的“信息技术”看了起来。

咦,这是什么?print("Hello World")……

“欣媛?又在研究什么呢?”她的好闺蜜艺姿走来问道。

“这个叫 Python 的东西,看起来好有意思哦!”说着,欣媛把信息课本给艺姿看。

“这个啊,这个我小时候学过,但是真的很难学。”艺姿摇摇头。

尽管有这句话提醒,她对于 Python 的热情仍没有任何消减。上完第一节信息技术课,了解了 print 和 input 的用法,她已经迫不及待想要走进深邃莫测的程序世界了。一回到家,她就打开电脑,下载了 Python,并且饶有兴致地研究了起来。最后,她敲下九行代码:

print("请输入一个时间:")
shijian=input()
print("请输入一个地点:")
didian=input()
print("请输入一个人物:")
renwu=input()
print("请输入一个事情:")
shiqing=input()
print(shijian,renwu,"在",didian,shiqing)

这应该算写好了吧?可是怎么运行呢?糟糕,上课讲的忘记了……Run……是这个吗……她尝试着,突然界面切到了 Shell,上面显示了一串她当时还看不懂的英文,一串文件地址,还有一行字:

请输入一个时间:

这……程序运行了?她起初感到很不可思议,转而又为自己独立编写出了自己第一个程序而骄傲。

四年后……机房……欣媛……写出更复杂,更令人惊叹的程序!就这么定了!在她第一次运行自己写的程序的时候,她心中就有了梦想。

屏幕上的光标闪烁着。“编程,是真的很难学。”闪烁的光标,如同艺姿眨动的双眼,看着欣媛的内心,让她想起了闺蜜的提醒。她有些犹豫。但没多久,她看到光标上方两行那行字,犹豫直接转为了坚定:

四年后 欣媛 在 机房 写出更复杂、更令人惊叹的程序

她把自己独立编写的第一个程序,命名为“程序 1”。

03 规模更大的……模拟

一年多过去了,欣媛的电脑里,程序的编号递增,已经达到了 28。这些程序形形色色,有猜数字游戏,也有模拟彩票,甚至有 tkinter 界面化 F1 车手查询程序。她把这些程序分享给好朋友,他们都觉得写的很不错。但是,欣媛心里知道,这种程序,距离“专业”,相差不是一点半点。她打算更进一步,编写规模更大的程序。

她新建了一个程序,编号 29,内容是她的好朋友正杭很喜欢的红心大战。她理清思路:角色名称设定,发牌,出牌,判定是否可以出这张牌,判定分数,胜负判定……几个月的闲暇时间,她几乎全部花在这里,最后,她将自己亲手打造的“杰作”:一个长度 28KB 的红心大战程序,发给了正杭。

几天后,正杭回了欣媛消息。

“程序有问题:为什么有一个人连着出了两次红心 9?”

啊?这么长的代码让我怎么找问题?欣媛重新打开代码,找了又找。每一行代码看着都没有问题,bug 仿佛在和欣媛躲猫猫。

一天又一天,一夜又一夜,欣媛还是没能找出问题所在。终于,在第 146 行不起眼的一处,她发现了出牌判定中的一处小问题。

后来她了解到,比起专业程序员寻找程序中的小 bug,这个问题毋庸置疑算极其容易的。并且,这个红心大战程序如果放在信竞圈,因为它不包含任何算法,只能叫做“大模拟”。

“编程,是真的很难学。”

004 初恋

天地一瞬万变,转眼间欣媛和她的好朋友都要分别了。

艺姿,正杭……昔日还在一起研究程序,一起讨论问题,甚至一起表演《后妈的茶话会》的好友,今日却到了道别的时候。

纵有千般不舍,欣媛还是满怀期待,带着她唯一会的编程语言 Python,和唯一会的“算法”模拟,来到了风琪中学,开启她的高中新篇章。在高中她一开始还不适应,但是几个月的时间,她就和多个年级的同学玩到了一起,甚至还被同学起昵称“社交名媛”。

然而高中给欣媛编程最大的挑战,是繁重的学业。初中的五门课到高中的十门课,书包厚了,作业多了,电脑陪伴欣媛的时间也短了。半年的时间里,程序总数慵懒地在电脑内存中休息着,偶尔爬一爬,变成 30 或者 31。

是时候,和编程分手了吗?

答案是,否。

2023 年 2 月 17 日,欣媛迈着优雅的步伐踏进了机房的大门。这一天是她高中的第一次信息课,老师在介绍编程做题用的 OJ 系统的使用方法。欣媛打开系统,望着第一名凡漪的名字,心中满是崇拜。老师正要开始讲解 Python 的基本语法,而欣媛已经开始在上面做起了题目。

她想战胜凡漪,成为校内 OJ 新一代的榜首。

晚上,欣媛的手机突然响起,是艺姿。

“欣媛姐姐,你现在还学编程吗?”

放在几天前,答案尚不确定;但是此时,欣媛给出了确切的答案。

她敲下了两个字符:

1。

005 困境

又一年匆匆过去,欣媛战胜凡漪的目标已经实现,她升上了高二年级,被分到了珉穆老师的技术学考班中。

珉穆老师不仅是学考老师,他还是风琪中学的信息竞赛教练。见欣媛喜欢编程,他给欣媛的作业,是在学校的另一个 OJ,10OJ 上面做题目。

登录 10OJ 的那一瞬间,她大受震撼:这里竟然有上千道题目,有学选考题,也有一些很具有挑战性的题目,每一道题目都有自己的难度标签。欣媛起初按照珉穆的指示,在 10OJ 上面刷难度 1 的题目,针对技术学考进行学习。然而,时间一长,她意识到 1 难度题目太无趣了,想要挑战更高难度的题。

“这些……都是谁啊?博文,镇远,兰羽……怎么都能做 7 难度的题呢?我看看。”心里想了想,她点开了一道难度为 5 的题目。

CSP-S 2023 消消乐

这题……好难啊……对于还只会 Python 和模拟的欣媛来说,这道题显然不是她可能做的。她曾经引以为傲的,自认为很高的编程水平,在这一刻突然显得十分弱小。

“编程,是真的很难学。”艺姿的声音突然回响在她耳畔。

很难学……

“四年后 欣媛 在 机房 写出更复杂、更令人惊叹的程序。”不行,四年还没到,我绝对不能放弃。

她转而从 2 难度题目开始,一步一步向上走,可是,当她做到 3 难度的题的时候,就开始遇上困难了。

我这个代码为什么过不了呢?样例全部通过,代码逻辑没有任何问题啊?带着这样的疑问,欣媛找到了珉穆。

珉穆说:“这道题,你看它的数据范围是 5000 对不对?然后你看看你用了什么样的代码,是不是一个三重循环?这样,你的时间复杂度就是立方级别的,而评测机一秒一般情况下最多运行亿数量级的运算,所以你这个代码是会超时的。”

“虽然有不少人这题确实用立方复杂度过了,因为这题数据对于立方复杂度做法不算强,但是看到这个范围,正解基本上就应该往平方复杂度去想了。这是一道竞赛题目,需要用竞赛的算法,你没有学过竞赛,很难想到到底应该怎么做。另外我也不推荐你做这题,因为这道题目数据对于平方而言是强的,得卡卡常数才能过,初学者还是不建议做这种题。”

“哎?为什么立方也能过平方也能过呢?我的立方怎么就不能过呢?”欣媛依然不解。

“这个,因为你写的是 Python,Python 要比竞赛用的 C++ 慢得多。这样吧,你想做难度 3 的题目吗?我给你推荐一道纯模拟题,你现在的水平应该能做。”

“好。”怀着满满的信心,欣媛在放学之后打开电脑,专注的做珉穆老师推荐的题目。

还有,竞赛的语言是 C++……要开始学一门新语言吗?

她心里已经有了答案。

006 从 Python 模拟,到 C++,到竞赛队,到 CSP

2024 年年初,欣媛一路小跑到珉穆的办公室,想要开始学习 C++ 的基本语法。她看了看书,写下了这样的代码:

#include <iostream>
int main() {
    int x1;
    cin <<x1;
    int x2;
    x2=0;
    while (x1>0) {
        x2=x2*10;
        x2=x2+x1%10;
        x1=x1/10;
    }
    cout >>x2;
}

她提交了代码。“编译错误?怎么回事?”

“欣媛,你看,你没有使用命名空间 std,而且你 cin 和 cout 后面写反了。还有,这个变量名 x1 不建议用,如果你以后用万能头文件会导致报错。”

在珉穆的教导下,欣媛改了改她的代码:

#include <iostream>
using namespace std;
int main() {
    int a;
    cin >>a;
    int b=0;
    while (a>0) {
        b*=10;
        b+=(a%10);
        a/=10;
    }
    cout <<b;
    return 0;
}

这个代码,成为了欣媛第一个 C++ 代码。

她把学 C++ 的经历分享到了朋友圈。艺姿,正杭,凡漪,甚至博文、镇远、兰羽都对她表示了鼓励。

“欣媛姐姐,一定要去打 NOIP 啊!”

NOIP?可是……等我有机会了,我已经高三了诶……

“心中有梦想,就放心去追!忆起你之前写的第一个程序了吗?更令人惊叹的程序在等着你呢!”

暑假,欣媛毅然报名了风琪中学的信息学竞赛队。

2024 年 7 月 8 日,她踏进竞赛队集训地点 703 机房的那一刻,所有人都瞪大了双眼,没有人相信她居然会来学竞赛。

“欣媛大小姐?你高三来打什么比赛,去去聚会都更好。”依伦说道。她是信息竞赛队优雅的代表,代码十分精致,力求将常数优化到最小。依伦哼起了歌,便随手拿下了 10OJ 一道题目的最优解。

“我怎么包~~单~~了!”坐在角落的盛忆喊了起来。他说“爆单”的时候总会读成第一声。“你好。来做道模拟退火题吗?”他最喜欢 DP 和模拟退火,凡是这两类题他都要拼正解,其他时候他相信“大力出奇迹”,会直接开始打暴力,因此暴力在机房里被称作“盛忆大力算法”。

“喵~”是茂晗,风琪中学的队长。很多人不叫他本名,都喜欢叫他的外号“猫猫”。“欢迎喵。”

别的同学们也各有所好,峻霖在打手机游戏,武凤在玩 generals,而霄妍在看明星物料。整个机房气氛无比和乐,甚至可以称作“放松”。

欣媛选择了坐在茂晗身边。每次比赛,欣媛分数都比茂晗低很多,但是欣媛从来没有放弃。渐渐的,她在珉穆和茂晗的教导下,会了贪心,会了单调栈,会了树状数组,会了线段树……她逐渐赶上了大部队的水平,成为机房中游选手。她不求有多好的成绩,只希望自己能在信息学竞赛中获得一次奖项。

她刚刚追上机房水平的时候,CSP-S 的日子到了。

这是她第一次出征赛场,紧张是难免的。她先大体上扫了一下四道题目,发现第一题看起来不难,第二题看起来代码会很复杂,第三题……怎么有点像消消乐?20 分的部分分直接打一个枚举就可以。第四题没什么思路。

她决定先写第一题,直接模拟枚举转移。然后开第三题,把 20 分的暴力分数拿到。这样,她认为自己已经获得了 120 分。

先休息一下吧。

不对,珉穆教练说过要检查样例。样例跑跑……都过了。最后一个大样例,理论上应该输出 36247,程序跑出了……92994?

原来是她太紧张了,实现假了。她心跳加速了起来,一场比赛总不能挂签到题吧。她更正了代码中的一处问题,程序输出了正确的结果:36247。

她再看了看第二题,看起来思维和算法难度都不算太高,但是代码非常难写。将近一个小时时间过去,她写好了代码,然而在她测试大样例的时候,却输出了一些非常奇怪的调试信息。

几年前红心大战的 bug 寻找与代码调试突然映现在欣媛的脑海中。同样是几百行的代码中的一个微小的问题,却决定了代码功能正常与否。

她在代码里四处寻找,最后发现问题出在一个最“明显”的地方:数组开小了。欣媛啼笑皆非。

添上了一个 0 之后,程序顺利通过了所有大样例。此时时间还剩一个多小时,而欣媛的预期分数已经达到了 220 分。此时,欣媛面前有两道选择题:T3 or T4?部分分 or 正解?

欣媛心想,她四年来的愿望已经实现,是时候挑战一波大的了。

她选择:T4,正解。

很遗憾,她一个多小时的努力并没有取得任何分数。

“这是一次荒唐的冒险!”

“爆单了,亏损最大化!”

别人在看到欣媛的选择和结果,或许会这么想。

但是欣媛内心想的不一样。

“220 分,已经远远超过了我的预期。无论这次冒险结果如何,我都不会后悔。”

她做到了。四年后,更令人,不对,是更令自己惊叹的程序。她并不需要其他人的认可,她需要的仅是自身的成长。

007 钗头凤·CSP

没学过格律,敬请见谅。

欣媛作于 2024 年 10 月 30 日。

擂台险,信竞卷,阑干泣吾胭脂脸。骗分累,多测隳,既已成树,何堪后推?黑!黑!黑!

三题蓝,四题难,回顾忽惊暮风残。路车飞,任泪挥。纵首橙水,孰能AK?非!非!非!

008 OI 终章:更令我惊叹的程序

CSP 落幕了,欣媛带着 220 分的预期分数,回到了风琪中学机房。

出分的日子到了。欣媛的分数略低于 220 分,第二题有一个地方还是有一些小问题,导致略微挂了一些分。

“不错嘛欣媛小姐?”珉穆教练见她学几个月就能在机房中排名中游,赞道。

此时的欣媛,实现了她“在 OI 比赛中获一次奖”的愿望,已经准备退役。

她有很多的话要说。她想要感谢珉穆教练,从零基础带领她逐步迈入算法殿堂;她想要感谢茂晗和其他机房同学,在她遇上困难的时候愿意悉心指导她……

她最想要感谢的,是她自己。是她的坚持,或者她的倔强,让 CSP-S 2024 成为了她生命中最为绚烂的一页。

她找到茂晗,说自己要退竞赛了。

“啊?NOIP 不打了吗?”茂晗很惊讶。

NOIP……算了吧。

突然,一种奇怪的感觉在她的身体里涌动。“不好……”

她听到了来自阿塔霍兰的呼唤。

“刚刚好像哪里闪了一下。所以你还打 NOIP 吗?”茂晗继续问。

“不打了。”欣媛对茂晗说。这时,茂晗发现欣媛的身体好像在发出冰蓝色的光。

没有欣媛的机房,还是和往常一样,处在模拟赛与讲题的循环中。反反复复的日子匆匆过去,NOIP 的日子即将来临。

珉穆开始点名。“茂晗……峻霖……武凤……依伦……盛忆……都到齐了。等一下,AR-0487,欣媛?”

一个身影出现在 703 机房门口。“不好意思,来晚了。”是欣媛的声音。

对,我回来了。都走到这里了,再走一步又何妨呢?

欣媛毅然踏上了校车。

NOIP 比赛开始了。第一题看起来不难,欣媛感觉可做,于是她直接开始开题。不到一个小时,她的代码完成,并且能通过全部大样例。

然后她开始看第二题。这是数学题?还是 DP?她干瞪着题目半个小时,连暴力怎么写都没思路。

接下来她开始看第三题和第四题。第三题是一道树上题目,第四题的部分分是她最擅长的偏模板的 LCA。她思索片刻,决定这三题都做她力所能及的部分分。

她先开了 T4,由于她常常写 LCA,在考场上她很快就把模板默写出来了。略加调试,程序已经能通过她期待通过的那一部分。

保存了 T4 的代码之后,她又来回看了看 T2 和 T3。她觉得 T3 的 24 分部分分更加好打,于是她做出了最后一个选择:剩余全部时间拿来做 T3 的 24 分。她是如此专注于这道题,以至于直到比赛结束,将近两个小时的时间里,她没有再看 T2 一眼。

“距离比赛结束还有十五分钟。”欣媛刚刚调完代码中的所有问题,广播声响起。按照惯例,这个时候应当检查文件夹和代码。欣媛最后打开她的三个代码,检查无误后,她便静静等待着结束铃声。

“啥呀这四题难度得是 3677 吧!”一考完,武凤抱怨道。欣媛走到他身边,信心满满地说:“对,第二题我感觉至少有 6。一等线不会太高,150 附近最多了。我感觉难度是 4666……但是我后几道题不会,没资格评价。”

旁边的茂晗一脸疑惑。“我怎么感觉第二题比第一题简单呢。”茂晗在考场给武凤和欣媛讲自己的做法。

“哎,这限制条件不是全局适用吗?”欣媛问道。

“不是啊,一个条件对应一个位置。你猜条件为什么一共是 n-1 个。”茂晗回答道。

“哦!”欣媛和武凤同时意识到了这件事情。武凤很懊恼,而欣媛很坦然。

回到学校的路上,欣媛发现 NOIP 的几道题目已经被传到了洛谷上,洛谷的评级是蓝绿紫紫。“蓝绿紫紫?这不就对应 5466 吗?我……居然场切了 5 难度题?”欣媛不敢相信自己的眼睛。

四年前的约定,在这一刻彻底实现了。她满怀着喜悦闭上了眼睛,等她醒来,校车已经回到了风琪中学。

转眼间 NOIP 出分的日子到了。风琪中学的全部 OI 生再一次聚集到 703 机房。盛忆建议断网报结果,营造一种气氛,全机房一致同意了。

“AR-0121,依伦,一等奖!”

“AR-0154,茂晗,一等奖!”

“AR-0200,盛忆,二等奖!”

“AR-0247,武凤,二等奖!”

所有人都焦急等待着自己的结果出现。机房里充斥着紧张的气氛。“包(爆)单!后两题一分都没骗到。”盛忆有些不满。

“AR-0487,欣媛,二等奖!”

机房的目光聚焦到欣媛身上。此时的欣媛,面带微笑,脸上充满了满足。

“AR-0777,峻霖,二等奖……”名单还在报。这时,茂晗发现欣媛好像闪了一下光。

“AR-1831,锥怡,三等奖。本次风琪中学共有两人获得一等奖,八人获得二等奖,六人获得三等奖,是一个很不错的成绩!”珉穆话音一落,机房里充满了掌声。

教室的灯一盏又一盏熄灭,唯有 703 机房的灯还亮着。

“欣媛,要不我们一起走?”

“好。你先关灯,等等我。”

他关上了 703 机房的灯。她走出了 703 机房的门。深夜里,他和她的背影模糊却又醒目。

009 告别

又是普普通通的一天。以往的每一天,欣媛都会来找茂晗聊双方共同的爱好——OI,但是这一天却是个例外。

茂晗在自己的教室室门口等着欣媛的到来。12 点到了。12 点 20 到了。12 点 40 到了……欣媛还没到。

茂晗赶到 4 号楼欣媛的教室。他问欣媛的同学玉华,可是他却说欣媛早上第一节课之后就不在教室了。

咦?这是怎么回事?不在她自己的教室,也不在他的教室……那么只有一个可能的地方了。

茂晗飞奔向科学楼,走进电梯,按下“7”。

走廊尽头的 703 机房,关着灯,但是里面却发出了冰蓝色的闪光。

茂晗走进 703 机房。欣媛全身闪着冰蓝色的光,有冰霜在她脚边生成。

“茂晗?你怎么来了?”欣媛很惊讶。

没必要再藏着了。欣媛想。

“不好意思,我的真实身份没必要再隐瞒下去了。我是冰雪世界艾伦德利的公主,被女王埃尔萨纳允许来到地球生活 18 年。她见到我在成年之际,处于 CSP 与 NOIP 的时间之间,便许可我再延长一个月地球生活时间。如今,时间已经到了。我不得不回到冰雪世界了。”

欣媛小姐?你原来……是冰雪公主吗?

“是的呢。”

那你现在……

“我要回去了,以后我们可能再也无法相见了。”

茂晗的眼神凝固在欣媛脸上。

“你真的……真的不会回来了?”

“是的。但是,这并不代表我会在人世间彻底蒸发。这个记忆芯片,存储着我在人间 18 年 1 个月的全部记忆。我想找一个最懂我的人,把它存放在我人间最舍不得的地方,这个人就是你,这个地方就是 703 机房。”欣媛从口袋里拿出一个芯片。

茂晗接过芯片,紧紧握住欣媛的手。

“我希望……在未来,能有真正能理解我的人能够发掘我的记忆。当我走后,请一定要拿这四个日子成为我记忆的密码锁:200906,230217,240708,241130。这是我一生中最难忘的四个日子。虽然我觉得也不会有人真正懂我的心,但是……万一呢。”欣媛逐渐变得半透明。

茂晗收下了储存了全部欣媛在人间的记忆的芯片,轻轻在密码锁上输入 24 个数字,把芯片放在了风琪中学 703 机房的隐蔽一角,等待着未来,或许有一位能领会这位冰雪公主的内心的人,能够发掘出她的记忆。

欣媛轻轻一笑,随风飘散在空中。

“欣媛?欣媛!”茂晗望向天空,却见不到冰雪公主的身影了。

2024 年 12 月 11 日,康州下雪了。

11831 追忆

我常常追忆过去。

2147 年,来自 CodeForces 的 Che1920 想学习如何作《钗头凤》。为此,他咨询了来自洛谷的 lizihan500。对方告诉他:

在一位来自冰雪世界的精灵“米塞莉娜·赛德丽·诺塔斯·杜·施蒂浦莫莎·都拜琳娜·杜·阿伦黛尔”的人间记忆芯片里面,好像有《钗头凤》的格式。

“你这边的破译任务怎么样了?”

“我们这里任务已经基本上完成了,只是,一个密码锁一直没能够破译。看起来是要输入一些数字,但是我们都不懂。”

“要不……我来吧,既然是密码锁,我来做这个任务,这不就是‘追忆过去’嘛!至于为啥是追忆过去呢,一百多年前的 CSP 不是就有道题是密码锁吗。”

Che1920 急忙赶到实验室,看见芯核上显示着 200906 六个数字,下方还有三行 18 条线。他立刻知道需要填入的是三个六位数。

他想起自己上周末 AK CodeForces Div.1 的回忆,轻点六下键盘,输入那场比赛的编号 230217。

出乎意料地,第二条横线上竟然显示出了这个数字。

“这是怎么回事呢?我之前试的时候,第一条线填什么都可以,第二条却试不出来,怎么你一下子就成功了?”

Che1920 想了一会儿,发现这两个数字都是日期格式。“或许……我们要填几个日期?”

“来,试试看。”

“我翻历史咨询,她好像是一个学信息竞赛的,这些时间会不会都和信息竞赛有关?”

“有道理。”lizihan500 说道,开始查 2024 年信息学竞赛的时间,发现 CSP-S 是 10 月 26 日,NOIP 是 11 月 30 日。于是,他在最后两行填上了 241026 和 241130。他发现第四行对了。

“要是我没猜错,这四个日子是按照前后顺序的。所以让机器人枚举输入一下就行了。”

咔哒一声,最后的密码被解开,这位“米塞莉娜”的记忆展现在两人面前。

“《钗头凤》呢?哎?!没学过格律,敬请见谅?!合着我白忙活一场是吧!”

lizihan500 许久没有说话,他盯着解码出来的内容,沉浸于其中许久。

不知道过了几分钟还是几小时,他才开口:

“并非白忙活。解锁了一个这样的故事,或许是更大的成就。哎,这真的是一段值得追忆的传说。”

人物原型(& 特别鸣谢)

欣媛:Misserina。

艺姿,正杭:初中很多同学的结合体。

凡漪:高中校内 OJ 站长。

珉穆:高中信息竞赛教练 xaero7。

茂晗:高中机房同学 lizihan250。

盛忆:高中机房同学 EVENe。

武凤等:高中 oier 们的结合体。

非原创引用部分文本来源

P13241,已取得作者同意。