( ext{Day 0})
试机, 总体感觉不错, 至少不像初一时候的紧张, 毕竟是中青年选手了 ( ? )
当晚睡得挺好, 虽然是冲着一等奖去的, 但还是没有给自己过多的思想包袱.
策略
琢磨很久了.
我按照去年(S)组(330)的分数线大概估算了一下, 理想的得分状态应该是((200^+) + (150^-)=350). ( ext{Day 1}) 尽力磕出一两道正解, ( ext{Day 2}) 稳健骗暴力. 事实证明, 这样的策略对本次考试是奏效的.
( ext{Day 1})
将近七点起床, 看了一眼数论和匈牙利的板子, 坐车去巴蜀. 到的时候看着门口全是八中的校服, 心里很踏实. ( 迷之主场(buff)? ) 和初三的同学唠了会儿磕, 也放松了一下心情.
考试开始
(8:30) ~ (8:45) 读题
通读了三道题, 整体感觉不算特别难. (T1)应该能打正解, (T2)骗分的话能拿到(#1) ~ (#14), (T3)迷之毒瘤, 只想到(#1~#2)的全排列, 一眼分(100+70+10=180), 感觉需要再搏一搏了.
(8:45) ~ (9:15) 写(T1)
二进制串的构造, 由于冲着正解, 想都没想找起了样例的规律. 有了一个循环求每一位的想法, 但始终过不了样例. 看一眼表, (9:00).
瞟一眼同桌 ( 貌似是西附的 ), 已经开(T2)了, 感觉全考场就我一个还在肝(T1), 特别慌.
还好, 我想起了几次数学考试考炸的经历, 不要去在乎旁人的做题进度, 伸了一个懒腰, 重新读题, 发现题面其实介绍了这种二进制串的构造方式, 于是参照题面实现了一种递归的构造方法, 过了所有样例, 稍稍开心了一下, 投身(T2).
(9:15) ~ (11:00^+) 写(T2)
首先写了性价比较高的部分分: 链.
由题目对括号匹配的介绍, 很自然地想到用(stack)去维护序列. 在草稿纸上手玩了几条链, 发现其实就是一个比较简单的(DP)就能做到(O(n))求解. 不到(20)行代码实现了一下, 过掉了最后一组大样例 ( 一条链, (n=5 imes10^5) ).
由于感觉(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 imes10^5)的链也能用这种算法过掉, 证明空间没有太大的问题.
看了看时间, (11:00)过了, 由于生成一颗树比较麻烦而且没有敲树的暴力, 信仰不对拍, 开(T3).
(11:00^+) ~ (11:40) 写(T3)
我就拿(10)分好不好.
于是, 用( ext{next\_permutation}) ( 考试的时候差点背不了单词 ) 加上一堆瞎搞, 妥妥(O(10)分()), 过不了样例.
代码看了一遍又一遍, 虽然暴力也不至于过不了样例吧? 于是开始怀疑样例有锅. 手玩了样例一的(case2), 真的玩不出样例?!
生无可恋地重新读了好几遍题, 发现输入格式的神奇之处...
(...)
第二行(n)个整数, 第(i~(1le ile n))个整数表示数字(i)初始时所在的结点编号.
(...)
输入的不是(n)个点的点权, 而是点权(1) ~ (n)所在结点编号?
改了输入, 过样例了...
垃圾出题人.
(11:40) ~ (12:00) 检查
检查得很用心, 因为也打不来更多分了.
-
代码无关键字, 没有编译错误或警告, (check).
-
文件输入输出, 过样例, (check).
-
文件名, 文件路径, Ctrl+S, (check).
检查完后几分钟就完赛了. 检查时间还是比较合适.
( ext{Day 1}) 反思
考完估分(100+100?+10=210?), (llsw)说他(T2)对了拍, 想必打的也是正解, 搞得我莫名慌张.
以后应该要谨慎一点, 不是每次都能过大样例就(AC), 压缩一眼题的编码时间以给这种中档题更多的检查时间.
(J)组的快乐时光
下午水了波(J)组, 虽然没能(AK), 但也成功自信(++).
( ext{Day 2})
琢磨了一下分数, 感觉( ext{Day 2})至少应该要(120+), 可能无脑骗分就可以了. 当然这是建立在( ext{Day1T2 }AC)的基础之上. 那么, 就当做( ext{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:40) 写(T2)
开这道题的时候, 压力还是蛮大的. 目前(32+T2+55=T2+87), 也就是说(T2)大约需要骗到(40)分, 对应到部分分, 就需要(#1) ~ (#16)的(64)分.
往(DP)想, 轻易地发现一个(n^2)空间和(n^3)时间的暴力: (f(i,j))表示处理完前(i)个数, 最后一段是((j,i])的最小代价. 能拿(#1) ~ (#9), 还是悬啊!
然后, 我通过神奇的第六感输出了每个状态的前驱, 发现能够帮助其他状态转移的, 只有从(f(i,i-1))到(f(i,0))的第一个有效状态!
这样的话, 状态数压缩到(n), 转移成了(n^2), 貌似稳了?
于是我开始为( ext{Day1T2})可能出现的惨剧尽量拿分, 又发现对于(f(i)), 如果它能从(f(j))或(f(k))转移, 那么当(jge k), 从(f(j))转移就一定优于从(f(k))转移?
看了一眼读题时对题意的整理, 正好印证了对于一段和为(S)的数, 如果它既能划分进左边区块也能划分进右边区块, 通过简单的式子化简之这段数一定划分进左边区块更优. 于是我的时间从(n^2)变成了((n imes)玄学()
ightarrow n^2), 是不是更快一点能?
首先拿这个神奇的优化和(n^2)对过了拍, 没有出错, 又造了几组(n=5 imes10^5)的数据, 居然卡在(1.6s)过了!
最终, 信仰开大空间, 喜提(88)分.
(11:40) ~ (12:00) 检查
发现(T2)部分变量没开(longlong), 赶快打补丁.
昨晚昨天的一系列检查操作, 望着天花板思考人生.
( ext{Day 2}) 反思
有失误, 也有奇遇, 可能( ext{Day2T1})成为了目前唯一进步的空间, 估分(32+88+55=175), 总分((100+100?+10)+(32+88+55)=385?).
考后反思
估分极其之稳, (result:~100+100+10+32+88+55=385) ( 牛客数据 ).
总的来说, (S)组的考试算是平常发挥, 庆幸没有出现重大失误. 不足的地方在于把"暴力"和"爆搜"建立了某种神奇的联系 ( ? ) 局限了思维, 失掉了大众分. 也很感谢之前数学考试的爆炸让我学会了对于考试节奏的把控, 这次考试可以说心态, 节奏以及发挥都没有太大的问题 ( 对于考前定的目标来说 ). 戒骄戒躁, 继续努力吧!