ICPC Longest SubRoutine这三年

2024年4月18号,我们队(队名Longest SubRoutine)代表Univesity of Wisconsin-Madison(后文简称UWM),在46th ICPC World Finals拿到了第八名和银牌。这篇文章讲讲从建队到现在三年里台前幕后的故事和一些心路历程。一是希望能给自己和队友留份回忆,二是希望这样的故事也能引起同在编程竞技赛场上奋斗的大家一些共鸣。

队伍组成

这支队伍从萌芽期到现在也快有3年了,从组成那一年的时间来看,三个人的情况如下:

  • RobeZH,也就是我,UWM本科最后一年,主修CS,CF(Codeforces)的rating 2600~2700。
  • Subconscious(后文简称sub),本科在浙江大学读CS,是原来浙大Legilimens队伍的一员,来到UWM读master第一年,入学时CF rating已经达到了恐怖的3100左右。
  • LUL____SEPLED1305 (后文简称Nitit)是UWM的大二本科生,主修数学,CF rating 2300~2400。
队伍构成

队伍萌芽期

20年九月份,在UWM读完大三的我决定gap一年在字节跳动做科研实习。次年五月份的一个周末,我去参加了metabit公司办的个人线下比赛,比赛当天在酒店早餐的时候,在字节的同事fsy学长跟我说,他们浙大的subconscious会来UWM读master。sub在浙大所在的队伍Legilimens的实力我一直有所听闻,其队里的chenjb也是混迹多个洲icpc圈子的老大哥,也是我的多年网友。我动手搜了一下sub的CF profile之后有些激动(当时sub在CF上的rating已经有2700了),这时fsy学长给我指了指说sub就坐在旁边一个桌子。于是就有了以下的对话。

“你是不是浙大的subconscious?”
“是的。”
“我们一起去World Finals拿块奖牌吧?”

当时在场的人都笑了。 谁也不会想到当时兴奋中说的“狂言”,会在经历了很多磨难之后变成了现实。但即便是无心之言,当时在UWM苦于找不到最后一年的队友的我,知道了sub的到来也多少让我感觉:或许我们可以打出点成绩来。后来我们两个人报名了那个暑假的牛客多校训练,周末有空的时候就一起找找配合的感觉。我们也在偶尔练练题的过程中,慢慢来到了九月份的开学。

20年的时候,有一位数学能力很强的泰国选手来到了UWM,也就是Nitit。21年十月份Nitit也成为了我之前一场总决赛的队友(详细请见ICPC WF 2020),在多次训练里,我也感受到Nitit观察能力和思维能力的出众,又由于自己是代码能力大于思维能力的选手,就觉得队伍如果第三人是Nitit会是很好的组合。我跟sub讨论过后也觉得这个想法很不错,于是我开始劝说Nitit来。一开始Nitit觉得课业太多而且有点怕拖我和sub的后腿,所以有点犹豫不决,但是经过我长时间的劝说和有计划的安排训练,万幸之中他还是同意了加入我们。

劝说Nitit加入的片段

于是在2021年11月份,Nitit同意入队了之后,我们的队伍也至此构建完成。在和sub打多校训练的时候,我根据我和sub的id前缀起了个队名叫SubRoutine,因为Nitit的id是以L开头的,在他加进来之后,我们就一起叫做了Longest SubRoutine(某种意义上也跟这个ICPC史上最长赛季遥相呼应了)。

区域赛定在了22年的2月份,将是我们第一次小试牛刀的机会。

战术/分工/磨合

在12月份到1月份放假的期间,我们连续训练了十多场,磕磕绊绊但是也慢慢对彼此的风格有了熟悉。

在那个时候,在Georgia Tech读phd、以前是sub队友的chenjb也来到了我们队伍指导安排我们的训练,时不时给我们分析训练的结果以及分析对手。

chenjb教练的指导

我们也趁着课余时间和暑期时间参加了Moscow Pre-finals、Bytdance Pre-finals和Fake NAPC这几个训练营。在不断地被不同大洲的队伍虐之后,我们也慢慢摸索出了属于自己的队伍风格和分工。

一开始因为我和sub都是比较全能的选手(除了几何是只有sub会),所以不同题目类型没有明确的分工,基本上就是题目有想法就优先自己写,Nitit会跟我们参与讨论并且有想法也会自己上机写。

而在不断的训练过程中,慢慢也能感觉到我对一些代码量不小但是结构上比较干净的题目会相对擅长,而不擅长一些带有复杂分类讨论还有和数值相关的题目,所以跟sub时不时的讨论之后,决定让我负责做流/字符串/图/数据结构这些一般带有长模版的题目,而万能的sub就负责数学/几何/DP还有一些模拟,Nitit则侧重数学/DP并且给队友扔想法和观察。而题目的代码大部分时间就由我和sub来完成。而作为专干苦力活的队长,模版的整理就由我负责。

早期在我自己打CF的时候,每道题过了经常会去看别的solution,研究更短更简洁的写法,这也导致了我在ICPC中对于机时需求相对少,并且对于一些经典的pattern总能想出优雅干净的写法,在机下准备足够之后,上机将代码完成;而sub的特点就在于什么都敢写,所以在变化更多的几何题/模拟/讨论题上,可以在机上把复杂的做法调对。

整个体系在22年五月份的北美决赛前也慢慢成型,得益于每个人都慢慢适应了自己的位置,我们在可做题特别多的北美决赛也打出了很强势的表现仅输给了状态火热的MIT和Swarthmore。而这个体系也成为了我们队伍沿用了到World Finals的体系。

长久的对手

赛季从21年2月份开始,我们顺利在区域赛AK夺冠,然后在五月份拿到北美决赛第三的成绩,两场比赛都是完成了赛前的目标。然而美中不足的是,在区域赛3hrs40mins做完题目出来之后,发现在使用相同题目的Mid-Atlantic Regional中Swarthmore College在开场2hrs15mins后就做完了所有题目。而在北美决赛中,虽然完成了赛前拿下前三的目标,但却以一题的劣势惜败给了swarthmore屈居第三

从那以后,我们多多少少会把swarthmore看成宿敌,每次训练如果他们队伍也在就会不自觉地做对比。在北美赛区里,比起遥不可及的MIT,swarthmore更像是旗鼓相当、相互追逐的对手,也是我们队伍当时很希望在World Finals能够复仇战胜的目标。

北美决赛结果:罚时很小的我们没有来得及写完B题,惜败于Swarthmore

心态/性格/变化莫测的世界

性格的变化

在22年5月份打完北美决赛之后,我就去往了UChicago开始了我的PhD,期间发生了很多促使(或者迫使)我的性格成长的事情,自己的性格也变得更加强硬和坚决。加上自己也开始阅读一些心理学的书籍,慢慢学会了一些在竞技比赛中应对压力的技巧和能力。(推荐一下《The Inner Game of Tennis》和《The Power of Now》)于是自己在键盘之下也慢慢成为一个能扛压力、能鼓励队友的队长。

一延再延的总决赛

因为之前一个赛季的World Finals Dhaka预计在22年11月份举行,所以我们这届的总决赛需要等到在这之后。打完北美决赛之后,就有陆续的传闻说World Finals会在23年11月举办,而且为了赶上进度,ICPC决定把连续两场WF办到一起,不久后这个消息也得到了确认,时间是11月12-17号,地点在埃及的度假胜地Sharm El-Sheikh。在23年9月份我回到美国之后,便开始整装待发,跟队友进行最后的准备。因为毕竟也是自己的最后一次机会,想要拿到好成绩(加上当时的科研压力),所以到了准备的后期感受到了十分大的压力,到了近乎burn out的程度,不过慢慢调整之后(期间rpeng教练也做了一下思想工作),心态也慢慢回归到了正常。

Peng老师的思想工作

23年10月份初,巴以冲突加剧,而埃及是以色列的邻国,比赛地点Sharm El-Sheikh则离以色列更近了,这也为比赛增加了会被推迟的可能。在赛前的倒数第二个周五晚上,sub跟我正在模拟2011年的World Finals比赛,我们收到了比赛推迟的消息,消息里面说新的时间会是在2024年的3或4月份。(巧合的是2011年的World Finals也是原定于埃及的Sharm El-Sheikh,因为阿拉伯之春,被迫推迟并且地点改到了美国的奥兰多。)

对手的退赛

推迟之后,原本的重压也被卸下来了,我们休息到24年的年初才重新开始了每周一训,而比赛被重新确定在了4月14-19号,地点在埃及的旅游城市Luxor。重新开始训练之后,我也有意识地观察着自己紧张的情绪,没有给自己过大的压力。

在比赛开始一个月前,我们听到了两个对于北美队伍不好的消息,一个是Swarthmore整个队伍退赛的消息,另一个是Georgia Tech因为一个队员美签过期而且已经开始工作,所以只能够以两人队出战。虽然这相当于增加了我们拿到奖牌的概率,但是北美的队伍少了竞争力,而且我们也失去了复仇Swarthmore的机会,还是有些怅然若失。

Swarthmore退赛

不过经过了一些思考,我也慢慢意识到,最重要的事情,或许不是击败某个具体的对手,而是战胜自己的恐惧、然后发挥出最好的自己。所以我在赛前的朋友圈文案上写了一句比较中二的话:“第一个和最后一个对手,都是自己”。

正式比赛:埃及之旅

赛前准备

签证

sub和我因为是中国国籍可以直接申请埃及的电子签证,过了三四天就批下来了,而身为泰国人的Nitit的签证则要复杂很多,需要有额外的程序,根据大使馆的时间预计,Nitit是不可能在三个月内走完所有程序拿到签证来到比赛的。

于是我们就向ICPC官方求助。而期间与官方保持联系是他们一直说正在处理了,我们的心情也慢慢变得越来越忐忑。好在开赛两周前终于拿到了ICPC发来的埃及临时落地签许可,去往埃及总决赛的最后一块拼图终于拼上了。

比赛预期

早在去年9月份的时候,我和chenjb就统计了一下在这次WF的对手情况,统计出来之后感叹是神仙打架,在2019年之后就没有强队这么多的情况了。大概有六个队会很难打败,而有至少其他九个队是水平相近、不相上下的。所以赛前的预期就是争取能拿到奖牌,而且拿奖牌也需要发挥得比较好才行。

对其他队伍Codeforces实力的统计,金色部分是肯定打不过的队伍,而绿色包括了大部分实力没有差太远的队伍。

抵达埃及

我们三个人都从芝加哥出发,因为芝加哥没有直飞埃及的飞机,我们先是花九小时飞到罗马,然后又花了三小时才飞到了开罗。因为那个周末没有训练,我们在去罗马的飞机上模拟了最近的一场Latin America Championship,因为是简单题加上大家状态都还不错,四个多小时就做完了题目,打了UCup榜单上的第19名。

出发前查了天气预报,埃及各地最高气温是40摄氏度,有了一些心理准备,但是真正到了之后还是感觉炎热难耐。还好队友有防晒并且HUAWEI给每个人发了一把伞,才有了避暑的工具。到了Luxor之后时差很难调整,加上过度炎热消耗了我很多体力,经常在下午3点过后就困得不行,

原本热身赛前某天下午还是想选一场最近的CCPC Final作为最后的训练,结果做了一个多小时,sub和我便呼呼大睡,只好作罢。不过比赛前的两天,sub和我都休息得很好,Nitit也算休息足够,所以还是我们为正式比赛储备了足够的精力。

现场注册时拍的全队照片

热身赛

热身赛发现有一道最近练过的WF题目(大意是赌场里面求最优退出策略的赢钱期望),而且因为看过了题解知道有个非常简单的写法(不用三分套三分),Nitit推完公式之后,我上机敲完并优化,提交了几次之后就拿到了热身赛那道题的first solve。

在HUAWEI Challenge的时候敲键盘发现自己因为用惯了Mac的键盘,很难适应回linux/windows的键盘,于是在open practice的时候,决定多敲几个模版,验证一下模版hash的同时,把键盘再熟悉一下。好在敲到了oepn pratice快结束的时候,感觉手感终于顺起来了。sub对键盘很熟悉,所以不需要多加练习。

现场的鼠标中间的滚轮按下去会自动粘贴剪贴板,sub和我经常误触很恼人。熟悉键盘的期间,浙大的Peng Bo同学经过,顺便问了一下他们如何修改,他们正好有一行很简单的命令能够解决这个问题,改完之后就再也没有误触过了(谢谢pb🙏)。

热身结束之后感觉人也比较困了,所以就回去休息,开始静候第二天正式赛。

把正式赛开场需要写的内容记在了模版上

正式赛

正式比赛开始前也是跟队友说,肯定有比我们厉害的队伍会爆炸,肯定有比我们弱的队伍会爆种,所以还是打好自己的,前期的榜也不用太在意,看好哪些题目可做就行。鼓励了一下紧张的Nitit,说卡题的话我们相互帮助,不用担心一个人卡着。问了问sub紧不紧张,久经沙场的他说还好,就跟他稍微提了一句:“不用太急,我们稳着点打”。

(注:本次比赛题目序号从P开始,到Z结束)

前期

开局我把header快敲完的时候,sub就说会P题了,开始写。在6分钟我们看到了oxford过了Y,我读完之后想到了很直觉上对并且很短的做法,Nitit听了之后也觉得做法很对,所以我就上机几分钟写完了,提交之后就通过了本场第一题。期间sub继续写P,而Nitit读了W之后告诉了我一个感觉对的解法(解法:前四个问任意三个都相互线性独立的问题,然后最后一个问题分辨出4种不同的情况),Nitit说没有证明,我想了一会儿给出了一个很直观的证明,就让sub下机,我上机写完之后,提交获得了通过。

过了三分钟,sub也写完了P提交了获得了通过。至此在比赛的第32分钟,我们凭借着极快的节奏来到了全场的第一名并维持了20秒,之后有一段时间只有以速度见长的CMU排在我们前面。赛前也跟队友说了前期的榜无论好无论坏都不代表任何事情,大家也都不敢怠慢继续看后面的题目。

左:做出第三题来到第一名,右:sub写T题

中期

然后我们就慢慢来到了无比折磨的中期。Q、T、U三道题都有队伍通过,我们散开来看了题目之后,sub有了几何题T的做法,上机开始写并说这个会写比较久,我和Nitit就开始想Q和U,Nitit给出了U的做法之后跟我讲,我大概理解了做法之后,因为做法的分类讨论很复杂,打算留给sub在几何之后写。

过了一会儿Nitit给了我Q的做法之后,我开始上机写Q,sub提交T返回的是WA(Wrong Answer),所以就开始跟Nitit讨论出了什么问题。我写完Q之后调了一会儿很快通过了样例马上提交返回了WA,下机跟Nitit讨论那里出问题,而sub上机继续修几何。Q的公式和写法都很干净,而题目输入里给的顺序很不平常,我和Nitit都同意很可能就是这里没写对,所以我把permutation的反索引删掉交上去,就获得了通过。期间sub也造出了一组自己程序的错误样例,过了一会儿重新提交,获得了AC。

这个时候我们回到了大约第15名,sub也开始听Nitit的想法开始写U。而我开始看其他的题目。过了20分钟左右我们有了U的第一个版本,提交获得了WA,这个时候我们并没有下一个题可以同时写,而且下一个题V已经有5~6个队伍通过了,于是决定让我上机写U的暴力生成,而sub来看偏数学的V。

U题是个构造最优解的题目,在写完暴力枚举之后发现我们有情况漏掉了解,让sub改完之后提交仍然是WA。期间我们也慢慢掉到了二十多名。随后我继续上机,加了一些对特殊情况的对拍之后,发现了另一种情况不是最优解,sub改完提交之后终于获得了AC。在齐心协力下我们终于来到了6题第15名左右,比赛也进入了第四个小时。

左:焦急等待U的第一次提交结果(返回了WA),右:我开始上机写U的暴力

后期

在我写U题的暴力对拍时候,sub也想出了V题的做法并且和Nitit验证过了,所以在过了U题之后sub就开始上机写,期间我和Nitit还是在剩下的题目里来回思考,并没有好的进展。sub过了一阵子就写完了V,样例并没有通过,查了一会儿发现是Nitit给的题意有点小错,好在主要的思路并没有变,经过sub一些修改之后,便通过了样例,提交获得了AC!仅仅花了37分钟就写完并1A了这道题!这时比赛还剩一个半小时,我们来到了场上第10名,也算艰难度过了中期,来到后期。

此时R题有三个队伍通过,此外除了仅mit一个队通过的X题,其他没有别的题有人通过。三个人开始讨论R之后,sub猜测如果两个环相交,是可以排序任何的permutation,经过讨论决定让我上机写个暴力程序确认一下规律。写完暴力之后,发现在一个边双连通分量里,有环相交的情况只要存在偶环,答案一定是可以排序,没有偶环的话,需要看逆序对数量的奇偶。遵循sub最后一个小时优先在机上的策略,还是决定让sub写这个题。

sub开始写了一会儿之后,我看了一下榜,大概有5-6个队过了R,意味着如果想要最后前十二名拿牌的话,很大概率要把R过了,而且只要R在尽量少的提交内通过,很可能可以拿到奖牌,所以我们决定三个人都专注在这道题上,在比赛结束前合力做出来。所以我就让Nitit开始造了5-6组额外的数据,并且把图的结构都画出来,方便sub debug,而我就上机帮sub分担一些代码压力。

封榜前我们掉到了第12名,所以跟一开始的猜测类似,如果通不过这题的话,一定与奖牌无缘,但当时也来不及慌乱,大家都专注地把事情干好。我上机给sub敲完了数组最小表示法、逆序对数量、和点双的tarjan算法模版,写完顺手测了一些数据保证都是对的。

左:sub专心写V的代码,37分钟就写完,然后一次通过(太强了!),右:接近封榜,在写R题需要的模版

P.S. 值得一提的是,在某一周的Universal Cup的比赛中出现了一道对每个点双内边的信息统计的题目(I: Color Cycles),当时我因为tarjan写错了卡了大半场比赛,回去一气之下把带有点双内点信息+边信息的模版加进了我们队伍的模版,没想到在这次比赛里能够直接派上用场(因为需要判断图是否是没有偶环的仙人掌),在比赛的最后时段为我们省下了很多需要自己想写法的时间。

敲完模版并验证之后来到了4hr10mins,然后sub聚精会神完成了剩下的代码,一个一个调过了Nitit出的数据,在比赛还剩20分钟时完成了第一次提交,返回了WA。这时我上手造了一组树结构稍微复杂的数据,让sub发现了分类讨论里的问题,修改之后通过样例来到了最后8分钟,sub提交的时候我们都屏住了呼吸,内心默默祈祷。这次提交的pending时间格外长,内心有了一些好的预感,在经过了漫长的十秒之后,屏幕上返回了CORRECT!

最后的八分钟也没题可以写了,就让全场没碰键盘的Nitit上去写写S题的O(n^3)做法,慢慢到了比赛结束。

比赛结束后,我们开始计算我们可能的排名,因为在封榜后有一些队伍R题的提交有很多次以至于即使通过了,罚时也会落后于我们,所以经过计算我们应该能够排到第9名。清华大学的R题在最后一分钟仍然有提交,而有消息说他们封榜后通过了一题,我们猜测他们通过的是仅提交三次并且在274分钟完成最后一次提交的X题,所以题数相同罚时低还是会排在我们前面。

封榜后的提交情况

颁奖典礼和滚榜

锁定前12名

尽管理论上计算,我们肯定至少能拿到铜牌,但是真正锁定前12名的时候还是觉得很梦幻。拿到ICPC的奖牌是从三年前就开始,就存在执念的一个梦想,期间有很多时候感受到和别的强队的差距,内心会被打击,没想到最后能够凭一些实力和足够多的运气,真的实现了我们的梦想。

锁定前12名
意外之喜

而滚榜滚到清华的R的提交时,竟然发现清华通过了R题,也就意味着如果清华只过了R而没有过X的话,将和我们通过题数相同并且罚时落后于我们,而我们能够上升到第八名获得银牌。在公布清华X题结果之前,我们都深吸了一口气,静候命运的降临。解说台宣布结果是Wrong Answer,我们成功获得了银牌!

上台领奖的时候,觉得这一切太梦幻了,即使在292分钟通过R的时候,也没有能想到居然这么幸运,能够以仅36分钟的罚时优势力压后面的清华和东大拿到银牌。在中期爆炸的情况下,开场连过的三题似乎在最后给了我们刚刚好的罚时优势。如果在某个阶段再多犯一个错,可能罚时也不足以获得银牌了,只能说是太受命运的眷顾了吧。

纵观全场比赛,尽管中间波折很多,但是和队友之间能够互相兜底,一起艰难推进到了最后的决胜阶段,加上sub的个人能力爆发和最后的一锤定音,才能够打出这样强势逆风翻盘的表现。上台领奖时有种不真实的感觉,经过很多起伏波折,终于站上了总决赛的领奖台,内心充满了喜悦和感慨。

左:上台领取银牌,右:比赛终榜

结语

命运的齿轮

2018年,为了不浪费两次WF名额,在很容易进WF的北美弱区读大二的我没有参加当年的区域赛,而是作为co-coach帮忙组织学校的训练,为后面几年留下了两次WF资格,

2019年的ICPC World Finals在葡萄牙的波尔图举行,因为主教练Dieter没有办法去,我便作为co-coach随队一起参加了比赛。在那场WF,EC赛区的南京大学以落后第12名49分钟的罚时差距屈居第13名,而ICPC颁奖时也没有给南大补上铜牌,导致了次年EC地区少了一个铁牌直接晋级World Finals的名额。

同年,浙江大学Legilimens队伍在徐州区域赛和EC-Final都获得了第四名,但或多或少因为EC地区少了铁牌的名额,错失了当年晋级WF的资格。

2021年,来到UWM读本科第一年参加区域赛的Nitit因为罚时的劣势输给了同校的另一只队,错失了晋级下一个阶段并争取WF名额的机会,也决定在第二年继续参加区域赛。

同年,还有一次参加总决赛次数的Legilimens队员subconscious来到了北美,而结束gap year的我也带着最后一次WF次数回到了校园。sub和我成为彼此最后一次WF的队友,加上Nitit凑齐了能力互补的三人,而同样因为剩下一次WF名额而来到北美的chenjb(也是Legilimens的队员)成为了我们队伍的常驻教练。

后来发生的故事就如上文所述。而如果有七、八件事情没有恰好幸运地按这样的顺序发生,我们很可能就不会有这一只能在世界赛场上打出竞争力的队伍,也就没有上文这个精彩的故事了。

单纯的快乐

然而,换个角度想,如果最后我们没有通过R题从而错失奖牌,难道我们这些年的过程就没有价值了吗?难道我们的故事就不精彩了吗?

还记得2017年8月份,没怎么接触过线上竞赛的我,在听闻别人提到Codeforces之后,在好奇心的驱使之下,加入了自己的第一场CF的比赛,那时的心情很纯粹,享受着思考过程,喜欢竞技的我也享受着和几千人一起同场竞技的快乐。后来在学校也有了比较活跃的编程比赛的community,大家一起发展这个爱好,也相互地学习精进,我在其中也获得了很大的归属感。

而在最后阶段太过于专注自己目标的时候,似乎开始忽略了过程的快乐。其实这七年最大的意义,并不是最后拿到了这块奖牌的结果,而是在追求目标的过程中享受解题的乐趣,为看到自己水平慢慢提升而感到快乐。多年后,我们不会忘记打赢对手的快乐和被对手击败的挫折,也同样不会忘记用美妙解法解出种种题目的兴奋,更不会忘记训练完我们一起从机房出来、走在洒满夕阳的University Ave上听风吹过的放松。

皮克斯电影《心灵奇旅》里面出现过这样的一个故事:一只小鱼想要寻找大海,却没有意识到自己就从一开始就已经在大海里了。

结果的好不好很多时候取决于运气,而过程的酸甜苦辣却是一直存在的,而这其中的意义要远远大于结果的意义吧。自己又何尝不是一直都在“海洋”里了呢?

最后的最后

这场比赛结束,我长达七年的竞赛生涯也就告一段落了。之后的几个赛季应该会作为芝加哥大学的ICPC教练,以另外一个身份继续这段旅程,也会看向更广阔的世界,寻找自己新的热爱。这七年成长了很多,结交了很多志同道合的朋友,在跟世界交手的过程中,也学会了跟自己相处,这些都是编程竞技给我带来的珍贵礼物,希望以后能带着这些礼物,一直走下去。

共勉。

P.S. 文末附一张Luxor的热气球,是这次埃及旅游方面为数不多的高光了。坐热气球还遇到了Codeforces的创始人Mike Mirzayanov,每次来World Finals都会遇到Mike,这次有幸又合了张影,还在热气球上给他和家人用相机拍了合照。

左:Luxor绝美热气球,右:和sub、Mike的合照

致谢

  • 我的神仙队友sub和Nitit
  • 教练Dieter,chenjb,rpeng老师提供的无私帮助(神仙教练团)
  • 各位竞赛圈子里朋友们
    • YaoBIG
    • 在Madison一起搞icpc的lsh,zjm学长,ysc,csr,bvd,Jirayu
    • Zhuolin Yang和Yen-Hsiang Chang
    • Runze
    • 在北京认识的tls(tangjz)、qls(quality)和fsy学长,wzj和wxx。
    • 在大二暑假一起打多校训练的郭深
    • 高中信息学竞赛的金靖老师
  • QOJ和Qingyu,提供训练平台(忘记跟Qingyu合影了!)
  • 生活中的朋友,一直关注和鼓励我的成长。
  • 还有我的对手们,在和彼此竞争中让自己变得更强

谢谢大家!