Live2D

Diary -「CSP 2019 J/S」 游记

Day 0

        试机, 总体感觉不错, 至少不像初一时候的紧张, 毕竟是中青年选手了 ( ? )
        当晚睡得挺好, 虽然是冲着一等奖去的, 但还是没有给自己过多的思想包袱.

策略

        琢磨很久了.
        我按照去年S330的分数线大概估算了一下, 理想的得分状态应该是(200+)+(150)=350. Day 1 尽力磕出一两道正解, Day 2 稳健骗暴力. 事实证明, 这样的策略对本次考试是奏效的.

Day 1

        将近七点起床, 看了一眼数论和匈牙利的板子, 坐车去巴蜀. 到的时候看着门口全是八中的校服, 心里很踏实. ( 迷之主场buff? ) 和初三的同学唠了会儿磕, 也放松了一下心情.

考试开始

8:30 ~ 8:45 读题

        通读了三道题, 整体感觉不算特别难. T1应该能打正解, T2骗分的话能拿到#1 ~ #14, T3迷之毒瘤, 只想到#1 #2的全排列, 一眼分100+70+10=180, 感觉需要再搏一搏了.

8:45 ~ 9:15T1

        二进制串的构造, 由于冲着正解, 想都没想找起了样例的规律. 有了一个循环求每一位的想法, 但始终过不了样例. 看一眼表, 9:00.
        瞟一眼同桌 ( 貌似是西附的 ), 已经开T2了, 感觉全考场就我一个还在肝T1, 特别慌.
        还好, 我想起了几次数学考试考炸的经历, 不要去在乎旁人的做题进度, 伸了一个懒腰, 重新读题, 发现题面其实介绍了这种二进制串的构造方式, 于是参照题面实现了一种递归的构造方法, 过了所有样例, 稍稍开心了一下, 投身T2.

9:15 ~ 11:00+T2

        首先写了性价比较高的部分分: 链.
        由题目对括号匹配的介绍, 很自然地想到用stack去维护序列. 在草稿纸上手玩了几条链, 发现其实就是一个比较简单的DP就能做到O(n)求解. 不到20行代码实现了一下, 过掉了最后一组大样例 ( 一条链, n=5×105 ).
        由于感觉T3不可做, 只能通过T2达到200+的目标. 去厕所清了一下缓存, 开始思考T2的正解.
        发现我链的处理算法可以搬到树上, 在向下搜索的时候顺便维护出从根到当前结点的stack的样子, 是否就能处理出树的情况呢?
        很快否决了这个想法, 因为带着STL递归是肯定会爆栈的. 在我代码里有这样一句:

for a chain:
        fix a stack.
otherwise:
        for all chain on dfs tree which begins with node 1, fix a stack.
memory ???

        ( 不敢用中文输入法, 果断选择中式英语. )
        但其实上面的思路已经很接近正解了. 我尝试在代码里引入简单的回溯思想, 这样用一个全局的栈跟随dfs的脚步维护即可. 用这种算法过了样例和n=50的大样例, 惊奇的发现n=5×105的链也能用这种算法过掉, 证明空间没有太大的问题.
        看了看时间, 11:00过了, 由于生成一颗树比较麻烦而且没有敲树的暴力, 信仰不对拍, 开T3.

11:00+ ~ 11:40T3

        我就拿10分好不好.
        于是, 用next\_permutation ( 考试的时候差点背不了单词 ) 加上一堆瞎搞, 妥妥O(10), 过不了样例.
        代码看了一遍又一遍, 虽然暴力也不至于过不了样例吧? 于是开始怀疑样例有锅. 手玩了样例一的case2, 真的玩不出样例?!
        生无可恋地重新读了好几遍题, 发现输入格式的神奇之处...

        ...
        第二行n个整数, 第i (1in)个整数表示数字i初始时所在的结点编号.
        ...

        输入的不是n个点的点权, 而是点权1 ~ n所在结点编号?
        改了输入, 过样例了...
        垃圾出题人.

11:40 ~ 12:00 检查

        检查得很用心, 因为也打不来更多分了.

  • 代码无关键字, 没有编译错误或警告, check.

  • 文件输入输出, 过样例, check.

  • 文件名, 文件路径, Ctrl+S, check.

        检查完后几分钟就完赛了. 检查时间还是比较合适.

Day 1 反思

        考完估分100+100?+10=210?, llsw说他T2对了拍, 想必打的也是正解, 搞得我莫名慌张.
        以后应该要谨慎一点, 不是每次都能过大样例就AC, 压缩一眼题的编码时间以给这种中档题更多的检查时间.

J组的快乐时光

        下午水了波J组, 虽然没能AK, 但也成功自信++.

Day 2

        琢磨了一下分数, 感觉Day 2至少应该要120+, 可能无脑骗分就可以了. 当然这是建立在Day1T2 AC的基础之上. 那么, 就当做Day 1 210分吧.
        ( 话说不知道为什么, 那个西附的同桌在考场外一看见我就开始膜, 难道210分很高吗? )

考试开始

8:30 ~ 8:45 读题

        T1读了很久, 抽象出了题意, 虽然很清晰但只有爆搜的思路. T2差点认成斜优板子, 后来发现新的限制, 暂时没有思路. T3也只有一眼的#1 ~ #8的暴力和#9 ~ #11的链. 心里还是没底.

8:45 ~ 9:30?T3

        开T3, 单纯地是认为暴力好写.
        随随便便55分, 跑路.

9:30 ~ 10:10?T1

        考场上被#1 ~ #8的超小数据误导了, 认为搜索就能水掉, 完全没有往DP骗分想, 更别说正解了. 这也是这两天考试唯一的失分较多的失误. 最终32分, 无奈开T2.

10:10 ~ 11:40T2

        开这道题的时候, 压力还是蛮大的. 目前32+T2+55=T2+87, 也就是说T2大约需要骗到40分, 对应到部分分, 就需要#1 ~ #1664分.
        往DP想, 轻易地发现一个n2空间和n3时间的暴力: f(i,j)表示处理完前i个数, 最后一段是(j,i]的最小代价. 能拿#1 ~ #9, 还是悬啊!
        然后, 我通过神奇的第六感输出了每个状态的前驱, 发现能够帮助其他状态转移的, 只有从f(i,i1)f(i,0)的第一个有效状态!
        这样的话, 状态数压缩到n, 转移成了n2, 貌似稳了?
        于是我开始为Day1T2可能出现的惨剧尽量拿分, 又发现对于f(i), 如果它能从f(j)f(k)转移, 那么当jk, 从f(j)转移就一定优于从f(k)转移?
        看了一眼读题时对题意的整理, 正好印证了对于一段和为S的数, 如果它既能划分进左边区块也能划分进右边区块, 通过简单的式子化简之这段数一定划分进左边区块更优. 于是我的时间从n2变成了(n×玄学)n2, 是不是更快一点能?
        首先拿这个神奇的优化和n2对过了拍, 没有出错, 又造了几组n=5×105的数据, 居然卡在1.6s过了!
        最终, 信仰开大空间, 喜提88分.

11:40 ~ 12:00 检查

        发现T2部分变量没开longlong, 赶快打补丁.
        昨晚昨天的一系列检查操作, 望着天花板思考人生.

Day 2 反思

        有失误, 也有奇遇, 可能Day2T1成为了目前唯一进步的空间, 估分32+88+55=175, 总分(100+100?+10)+(32+88+55)=385?.

考后反思

        估分极其之稳, result: 100+100+10+32+88+55=385 ( 牛客数据 ).
        总的来说, S组的考试算是平常发挥, 庆幸没有出现重大失误. 不足的地方在于把"暴力"和"爆搜"建立了某种神奇的联系 ( ? ) 局限了思维, 失掉了大众分. 也很感谢之前数学考试的爆炸让我学会了对于考试节奏的把控, 这次考试可以说心态, 节奏以及发挥都没有太大的问题 ( 对于考前定的目标来说 ). 戒骄戒躁, 继续努力吧!

posted @   Rainybunny  阅读(193)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示