【游记】THUWC2018踹线记

       Day1。

 

       早上九点多报道,然后就是试机。一开始有一些懵,没看清门外的通知,操作起来各种懵逼。不过提前适应过了在Linux下面编程,所以问题不大。调了gedit的界面,试了一下对拍,敲了一道试机题,然后就跑了。(其实过程中不小心踹了一次脚下的电源线)

 

       午餐还是可以的,红烧肉很好次啊。

 

       比赛是一点半开始,中午没怎么休息,导致下午开场一直犯困,半梦半醒中把所有的题目看了一遍。揉了揉眼睛再看T1,画风不对啊?这是……贪心?排一发序模拟一下就可以了吧。敲完之后顺手写了个对拍,没出错就交了,一发过PT,极其舒服。

 

       T2很想写线段树合并(不会dsu on tree),但是思路卡住了。就在这时候,电脑突然黑屏,心里咯噔一跳。定睛一看,不知不觉中我又踹了一次电源线。听见监考的小哥哥一直在喊着,“请各位选手注意脚下的电源线”,心里对自己不老实的脚感到相当绝望。然后又抓起纸质版题面(草稿纸)开始继续思考T2,脑袋里突然灵机一动,这道题是不是可以写点分治呀?每一次限定根结点必选,然后根据点的颜色一路dfs下去。但是我不会处理与根结点颜色相同的那一堆东西啊……算了,先打40分暴力。拿到了想拿的分数之后就跑去看T3了。

 

       T3大概是有结论的,但我推不出细节。想写后缀自动机,又不知道从何入手。果然还是自己菜啊……最后用string打了个15分的暴力。想再骗|b|=1的10分,因为某些奇怪的原因迷之挂了,最终还是没有骗到 。

 

       然后,接下来两个小时碌碌无为,怒肝T2肝不出。Day1PT分数:100+40+15=155。觉得自己好凉啊……大家是不是都200+啊。

 

       出来之后问了一下,T1基本大家都会吧。T2听说了很多种写法,点分治、树形dp、线段树合并、dsu on tree都有,我好菜啊。T3好像PT太弱,15分的暴力过40,50分的暴力过100,不知道数据是不是也这么弱呢。不管了,Day1凉凉,明天加油!

 

       (然后晚上就躲在阅览室的角落里打起了generals)



       Day2。


       早上吃完早餐就去校门口拍照,照片拍完就是开营仪式,看见了跟KPM同队的小哥哥。(哈哈哈KPM被我们拉回去给师弟师妹讲课啦)


       中午回宿舍休息了一下,下午很早就到了考场。结果考试推迟到了两点,头晕晕的,还是滚去阅览室玩手机吧。一点四十分进入考场,尬坐了一会儿,敲了一个fhq-treap的板子,然后比赛就开始了。


       先把题目全都看了一遍,看完T1顺手敲了一个15分的暴力交上去。T2的话……看着有点懵,容斥+dp?不管了先打一个10分的暴力。T3工业题,资料太长了,有时间再回来看吧。


       然后接下来就开始了肝T1的心酸历程。


       第二眼……倍增?倍增怎么写呀,推了大概半个多小时,还是毫无头绪。就在这时候,抬起头一看,电脑又黑屏了。怕不是又踹到了电源线……插头没插好,前前后后折腾了快十分钟。低下头继续思考,十五分钟之后抬起头发现电脑又黑屏了。一场比赛踹了这么多次电源线,我也是……算了不管了,调整好心态继续肝T1呀。 突然之间又灵光一闪,这道题好像可以写平衡树?开场的fhq-treap可以派上用场了。于是把开场敲的板子整过来,根据题目开始瞎改。一小时之后一拍桌子,样例过了!不对,还有大样例……突然又挂了呀。然后就开始疯狂调试,在调试过程中纠正了许多小错误。(样例真的良心)不知不觉中又过了一小时,两个样例都过了,交他一发!屏住呼吸看着分数在那里跳,看到accepted的时候整个人都开心了起来。


       然后,还有一些时间……T2打表找一下规律好了,没准能骗个30分。看了半天依旧茫然,最后的时间里又是一事无成。Day2PT分数:100+10+0=110。(大家好像都在肝T3?)


       出来之后发现T1写法跟大家好像都不一样……大家写的都是倍增,没有人写平衡树。大概介绍一下自己的写法吧……

 

       题意:给定n个点,从左到右1~n编号,li为编号i的点与编号为i+1的点之间的路径长度,每个点有一个加油单价pi。油箱上限V,移动1个单位长度需要消耗1单位的油量,油量为0时无法继续前进。给定m次询问,每次给定起点si、终点ti(保证si<ti)和初始油量vi,每次输出到达终点的最小花费。(n、m<=1e6,V<=1e18)

 

       我的写法:

       先讲15分暴力吧……倒着贪心。
       对于询问的终点T,从终点出发,倒着往回维护一个栈,栈里包含两个元素,价格p以及对于价格p需要加的油量d。其实栈里维护的就是从当前点到终点过程中的加油点以及在每个加油点所加的油量,使得到达终点代价最小。这样每往回走一个点,就可以很方便的在栈中进行修改,维持最优策略。而每往回走一个点,计算出在当前这个点需要加多少油的方式如下:假设当前在点x,x至x+1这一段默认由点x供应,即需要往油箱里加入d=lx的油。此时最多仍可在点x继续添加V-lx的油,即对于之前的决策,凡是距离栈顶油量小于等于V-lx且价格高于px的部分,都可以用px替换掉。将可以被替换部分的油量累加进d,最后把d与px丢进栈顶。而对于初始油量,由于其价格为0,所以可以直接去掉栈里距离栈顶油量小于等于初始油量的部分,然后统计整个栈里p*d的总和,即为答案。
       复杂度显然是不对的,所以可以利用平衡树进行优化,我选择了fhq-treap。而平衡树里的顺序,从小到大对应栈顶到栈底,保存着p(价格)、d(要加的油量)以及sum(子树内p*d的和)。
       首先离线所有询问,把所有询问按照起点从大到小排序,钦定终点为n。同时需要预处理出dis数组,disi代表点1到点i的距离。查询到一个询问时,先将信息更新到其起点si处。更新方式如下:先分裂出平衡树中前V-lsi部分的信息,在其中查询p>psi的部分(易证,对于前V-lsi部分,p呈单调递减,所以最后用来替换的一定是一段前缀),然后分裂出来,在剩余部分的最左边插入一个新的结点(p为psi,d的统计方式如上),将其与剩余的非前V-lsi部分的信息合并起来,完成更新。而对于查询,先分裂出前disti-dissi部分的信息,再在这部分信息中分裂掉前vi(即初始油量)部分的信息,中间vi+1至disti-dissi部分的sum即为答案,查询完合并回去就好了。


       晚上在阅览室里写自我介绍……能不能进面试仍然是未知数。但听说进了面试就有THUSC的门票,很舒服。希望如愿吧。



       Day3。


       宣布面试名单时真是紧张刺激,字典序就很难受了。我几乎是倒数被念到的,听到名字的时候整个人都开心得快要跳起来了。


       等面试的过程是很无聊的,不能玩手机,什么也不能干,于是我发呆发了四个半小时,到下午一点多才轮到我面试。一开始的兴奋啊、激动啊,全被磨平了。等待的过程中YJQ大爷进来讲了一下题,脑子晕晕的也不是很听得进去。


      面试的过程磕磕绊绊,我的对面坐着三个老师。首先是自我介绍,简单的个人信息什么的先介绍一下,然后是竞赛经历。因为没什么好讲的,所以只能瞎扯淡。“我是高一开始接触信息学的,当时什么也不知道,是被一张宣传单骗进了信息班。可能这也算是一种缘分吧……”然后我就看见对面的老师笑了起来,心情也渐渐放松了一些。之后就开始扯一些课余的兴趣爱好什么的,最后再夸一夸清华。老师发问了,“你刚刚提到了一个细节,有许多师兄来到了清华,那么,有没有师姐呢?”“竞赛方面的话目前没有。”“那现在你们学校的学习信息学的女孩子呢,只有你一个吗?”我简单地回答了一下情况,然后老师就继续问:“那你怎么看待这个问题呢?”我就回答了一大堆什么兴趣原因,氛围原因,各种原因巴拉巴拉,最后总结一句我认为OI与性别并没有什么多大的关系。老师也没有继续追问这个问题,然后接下来我就被数学题考倒了……更迷的是还有英文朗读!我磕磕绊绊地把文章读完,一边读一边想着要凉了要凉了,一边后悔平时打cf开翻译时没有顺便查读音。


       面试完出来已经很晚了,吃完午餐就匆匆跑去听讲座。而更紧张刺激的宣读签约名单的环节很快就到来了,虽然不抱什么希望,但心里还是莫名紧张。又是字典序。听着听着突然听到了熟悉的名字,是学校的一位高一大佬。HR好强啊。然而心里也默默紧张了起来。等等,刚刚……念了我的名字?


       我无法形容我那时候的心情,真的感觉跟在做梦一样。恍恍惚惚填了资料交上去,看着手里的省队一本约,才感觉到一切都是在真实发生的。


       何等幸运。


       接下来的三个月,更要好好加油。不管是为了自己,为了身边人的期望,还是为了更遥远的未来,我都必须好好努力。希望三个月之后,我能笑着把这份约实现!


       Zsnuo加油!

posted @ 2018-02-03 10:15  Zsnuo  阅读(501)  评论(5编辑  收藏  举报