NOIP2022 游记

· · 个人记录

正文(11.28 day3 ver.)

day-7

才从学校回到家结果突然被告知要马上去绵阳,龙泉驿区要静默了??

最后决定在同学家住一晚明天一早就去,手忙脚乱。

day-6

上午就到了绵阳,住的是两人一间的酒店,就在考点东辰旁边,环境还不错。

学校要考 noip 的同学都到了...

下午差点去面到多头了,可惜晚上要聚餐。

当晚健康码变黄了,很吓人,十点多被带去黄码专用检测点做核酸了,有惊无险。

day-5

绵阳要静默了,面多头机会没了(悲)。

但是面了 kds

同学们在酒店上 whk 的网课,我在模拟赛坐牢。

休息时间?o,启动,开始上班!!

day-4

稍微复习了点随机化相关的算法(去年 t3.jpg

今天没有模拟赛是做题,终于不坐牢了,小清新题。

做完了就上班。

晚上和同学看了会世界杯。

day-3

模拟赛坐牢,改完题上班。

晚上又和同学看了会世界杯。

day-2

模拟赛坐牢,但是自己切了个区分度还可以的题,以为打的不错。

一看榜,怎么大家都会啊?

改完题继续上班,以及复习。

没想到今天是我农历生日,吃到了蛋糕,好评!(虽然大家都吃过饭了)

调整作息,早睡。

day-1

最后一天了,开始复习一下(感觉 noip 没考什么啊),着重复习了 LCTSAMdinicddp

晚上稍微上了一下班,终于攒到 50 抽了,绫华指日可待!

然后大概看了一下光速乘和快速模和莫队就准备睡觉了。

结果再晚点多头突然找我给我交流了点考前心态和考试策略,受益匪浅,感谢他!

day1

day1开幕

起早了点,感觉早上刚起的时候如果很早精神真是特别好啊!

(以后考试压着点起床是不是赢麻了?)

调整了一下吃的东西,不然考场当喷射战士寄了咋办。

最后要进考场的时候问了一下群友怎么扩栈。

八点进去发现 wfy 就在我斜对面考,不错,考完就能知道一个省队的预估分了!

他来了过后我们对视了一下,呃然后就没有了,接下来开始考试。

开场在没发 pdf 密码的时候在观察样例,发现没有字符串题目,心里放松了很多。

然后准时开考了,进去先看一眼时空范围和题目类型。不错,都是传统题,时空限制也很常规。

上次考试输在没浏览完所有题目再决定开写,这次我告诉自己一定要先读完题,大概花了十多分钟。

看完感觉 t2t3t4 都不像容易的样子,以为是 构造+计数+期望结合 ds ,不太是我擅长的。

t1

于是先开 t1,一眼秒了,大概 15min 过了大样例。

t2

然后开始看 t2 ,发现部分分很奇怪,于是考虑 k=2n-2 咋做,观察到这个太“偶数”了,所以就想配对,这样可以空出来一个位置,然后就是朴素的。

接下来直接开始想正解,因为 k=2n-2 的这个性质太好了,感觉多一个就是多了一些情况而已。于是还是考虑配对来做,然后到了最后一个空位要放进去的时候,发现有的时候是可以不放进空位的,因为底下的必须用空位来消掉!如果放成三个,如果最底下的被消了,不就转化成子问题了吗。

但是这样会不会导致中间的被卡住了一直消不掉呢?

继续想,什么情况下会导致卡住,一定是上面那个比下面那个更快被消去才会!

那么我们就不放到上面会被下面先消去的两个元素上面就可以了!

但是要注意这里的具体实现,我们需要存所有下面比上面先到的栈的编号拿来备选,让它可以变成存在三个元素的栈,需要使用无序集合 unorderedset 来做到线性。

那如果所有的都满足这个咋办,那我放空位不就好了。

于是接下来我们讨论的问题就是:所有栈都有至少一个元素,并且一定有至少两个栈只有一个元素的时候,如何决策。

直接考虑最极限的情况,只有两个栈有一个元素,其他的都被放满了,因为刚刚我们保证过的性质,一定不会出现其他栈的底部元素被先加入,所以一定是加入一个新的元素,这时我们只需要找到两栈当中,后被消去的那个元素对应的栈放进去即可。

这里我考场脑子有点晕,拿了个对顶堆维护只有一个元素的栈,实际上可以只比较任意两个数就行了,可以做到线性。

那么时间复杂度为线性,可以通过。

思考大概花了我三十分钟,期间还尝试去观察了大样例的构造办法,发现不如直接想,于是就想完了。

最后大概用了两个小时才写和调完,代码写了 7kb,分类讨论太多了。(后来发现只是我写得有点复杂)

t3

此时考试还剩一个半小时,我获得了 200pts ,但是我感觉这个 t2 区分度很够了,所以后面两题我只要稳扎稳打写完暴力应该就上队线了。

毫不犹豫赶快开 t3 ,看完题面大概就知道需要缩点,然后看看部分分是什么,发现 n^2 分就挺多的,于是秒了一个直接 dp 的做法。

大概就是直接 dp[x][0/1] 表示 x 子树内是否选取点的方案数量。

这时我突然发现,这个 dp 的过程不就是线性的吗?难道这个 t3 就这样做完了???

此时我非常激动,因为这时我以为,标准省队选手应该都已经先我一步过了 t2 并且开始写这道题了,正巧斜对角这时候传来非常激烈的敲击键盘的声音,我擅自揣测是 wfy 也发现这是简单题在狂写了,于是我直接立马对着自己的思路就开写,大概 30min 就写完了。

可是我这次并没有直接过大样例,于是先强迫自己冷静,不要去想着 t4 的暴力了,这个时候我也根本不知道 t3 还能怎么 n^2 的简单写法,我只会目前这个线性做法,不成功则成仁,写出来 t3 我就一定上队线了。

中间经历了很多调试,包括对着大样例一个几千的数据调试,然后一步一步输出查看错误,最后大胆决定直接静态调试,整理思路。

这期间我脑子很混乱,想了很多不对的调试思路,比如中间有一会一直以为边双会像 SCC 那样有重边要用并查集来判,后来发现如果有甚至会对答案有影响,用 map 记录重边又可能会超时,最后还手写了个 pair 的哈希表(看我代码里面好多冗余的东西)。

但是我这样一系列改了过后还是不对,甚至输出都没变过,我就意识到一定是不会有重边的问题的,是别的地方的错误!

终于,在最后十分钟,我发现我的 dp 状态是没有包括到不选 x 但是子树内被选的点的 lcax 的情况

这时我的心脏开始狂跳不止,难道我真的可以上队线了?甚至是 A 队线?

但是我现在必须立刻强制自己冷静下来,稍微思考了一下就大概知道怎么改了,就是记录当前子树选了多少个,然后把这些东西一起传上去即可。

监考员的提示声在我耳边不断响起,可我此时满脑子里都只有最后的一个想法:调出来。

最后两分钟,当我的手最后一次颤抖地摁下 F11 ,屏幕上,那个期望了无数次的数字终于出现在眼前,我激动得大脑都放空了。然后立刻保存代码,但是我检查 noip 文件夹发现我之前保存的代码的位置不对!只有一分钟了,电脑右下角显示的秒数每一跳都让我心急如焚。

另存为,保存,另存为,保存,另存为,保存!但是这时,dev卡住了,我的大脑一片空白,然后立刻举手示意监考员,并向他描述了情况,他尝试了帮我关掉 dev ,但是并没有起效,然后又叫来另一个监考员,这时已经一点钟了。他问我代码保存好没有,我告诉他:我就是不知道到底保存好没有才举手示意(因为是在结束前卡住了,这个时候至少有 30s),然后他们调出了任务管理器就帮我关掉了 dev 。我请求能否让我再确认一遍代码是否保存成功,他们就告诉我不可以了...我心底里感到莫大的失落,万一我真的没交上去该怎么办?我是不是就此退役了呢?

但是一切已经结束了,我并不敢冒着被扣上“作弊”的帽子的风险坚持自己查看,我只能收拾好东西,最后一个离开了考场。

day1尾声

出来我问了 wfy ,问他有没有 300 ,他说悬,我大概对难度判断有了点把握,自己感觉这次的队线应该是在 250-300 左右,因为 t3 真的简单得太出人意料了...

然后出来问问同学,好像都说不会 t2t3 大家好像因为不太会边双也没做出来,但是好像 t4 的暴力分 52 是非常好拿的。

最后父母也来绵阳了,我大概说了一下情况和可能会寄的 t3 就没继续讨论这个,回酒店收东西准备吃个饭回家了。

然后下午在回家车上收到了代码(感谢多头!),一看 t3 真的没交上去,当时的想法就是:退役了。

回家后把 t3 改的那个地方凭记忆加了上去,果然在各处民间数据都过了...

后来发现可能队线并不高?以为自己还有点希望。

但是晚上 llzer 给我测的 t2 也有点问题?我有点麻了,但是太累了,不想再看 t2 我那冗长的代码,吃了晚饭上了会 o 就睡觉了。

day2

早上就起来看 t2 挂哪了,发现是该用无序集合存的编号我用了数组来存,真是太可笑了。。(具体错误见上文)

然后调整了一下心态,决定等正式成绩出了再决定退役的事情吧...

day3

如你所见,在休息和写会游记...

早上起来看 xtl 发现自己居然有 rk26 ?如果能拿到 300sc\ rk2 了??

结果发现是没测 t4 的榜,白高兴一场,下午更新了是 rk33 ,但是 300 还是 sc\ rk2,这下真输麻了。

未完待续。

(退役记嘛,等我退役了再说吧。)

小小的总结(11.27 day2 ver.建议不看)

(只是简单描述一下情况)

大概是寄了,300\to150 (可能?),明明都切 t2 了,不挂完全就是赢麻了,没想到是以这样戏剧性的方式结束了。

考场大概是秒了 t1 ,然后想了会 t2 ,会了之后写了很久(足足7k代码),最后本来打算打暴力了结果发现自己秒了 t3,调试到了最后两分钟成功过了大样例... (什么是大心脏啊/kx)

考场预估:100+100+100+0=300

民间数据:100+[50,55]+[15,20]+0=[165,175]

这次 t1t3都是白给的,感觉目标省队的话至少得会,然后 t452 也是在白给,所以标准一点的暴力分应该是 100+15+100+52=267,预估队线在 250 左右。

所以只能指望官方数据水一点让我没改过的之前 t3 的代码多过点和 t2 自己傻逼的点少挂点...

这次其实在考场上已经做得非常好了,最后两分钟极限调出 t3 更是让我激动不已。

可惜,因为一些代码保存的问题,还有我不知道为什么场内的 dev 能在最后那么关键的时候卡住了,求助了监考员来把我 dev 关了过后就不让我检查交的是否正确了(结果是并没有交上我最后调出来的代码,民间数据获得了 100pts)...谢谢你们,让我失去了随手上队线的资格/wx。

结果自然是白丢了 t3 的整整 100 白给分,太搞笑了。

同样的,t2 的挂分项也特别简单,明明该用无序集合来存的数据我却不知道在想什么用了数组来存,所以其实还可以挂的更多。

现在剩下的只有等待奇迹,还有考虑以后的 whk 学习。

更具体的游记会补的,退役记也会补的...