Day 0 报道日

晚上的时候我们的教练给我们做考前动员。给我们讲:NOI的五个小时需要认真的规划,不能被T1打乱节奏。他让我们思考明天的策略,把可能出问题的地方都想清楚。

结果后来,宿管给我测体温,结果莫名测出来37.8度。我被叫到宿舍外面去接受观察,不停地接受测试。还好最后我的温度降到了37.2,不然我就要被送到隔离室了。哎,本来想要9:30就睡了,结果又折腾到了10:30之后才睡着。

Day 1 考试日

考试前我先花了半个小时看了题目,一看T1的题面,发现\(w_i = 1\)我会做,\(w_i\)很大看上去是不能做的。一看数据范围,\(w_i \leq 5\),那我就把边拆点吧,然后发现\(m\)在5e2的时候就T掉了。又冷静想了想,发现我先推一个暴力dp,然后发现我只要记录前面\(250\)个状态就可以了。于是,这就是(max, +)矩阵快速幂的裸题了。再开T2,发现这好像就是一个很套路的题目,就是线段树合并我最近很少写,感觉要花点时间。再看T3,发现这题又是一道数据结构题,感觉不太可做。

我在9:05的时候写完了T1,开始写T2了。我花了大概一个小时想清楚细节并实现完毕。接着开始调代码,发现我有个地方越界了。我立刻想到可以用-fsanitize=address的命令来显示溢出的地方,又想到我开了很多空间,需要用ulimit来保证不MLE。

但我调了一段时间过后,我怎么改自己的代码,程序都会直接RE掉。这时候我才开始怀疑是这两个命令的问题。我直接我的代码全部注释掉,只留下输入的部分和开数组的部分,接着惊讶地发现:它还是RE了。

我把-fsanitize=address去掉,然后它就不RE了,然而WA了。又调了一会,总算调对了。我自己测了一组数据,发现它跑了2.2秒。稍微卡了卡常,就跑了1.8秒了。

此时比赛只剩不到两个小时了,而T3还只有\(0\)分。我T3稍微想了一会,发现里面有个区间逆序对的分,但是\(O(\sqrt n)\)很难写。不过暴力和\(C\)都还是比较好写的。然后我又稍微想了想一般的情况,发现我能够把\(4\)维的问题转换成\(3\)维的问题,接着就完全不会做了。

此时比赛已经过去不到一个小时,然而我每道题目都没有拍,且T3的C也不知道对不对。我感觉自己来不写\(A\)的\(O(\sqrt n)\)区间逆序对算法了,放弃梦想开始对拍了。

对拍过程非常顺利,每一道题都一遍拍过了。但此时比赛已经剩下不到20分钟了,这场比赛的有效得分时间也早就结束了。

期望得分:\(100 + 100 + 36\)

实际得分:\(100 + 100 + 36\)

好像算上\(A\)队加\(5\)分,我和NOI 2019 Day1一样,又是勉强达到了集训队线。

之后和寝室里面的同学讨论后猜测,g++开编译选项-fsanitize=address之后,会导致程序运行的空间增加很多,然后正好超过了我ulimit -v所设定的内存限制。

Day 0之前金老师让我们把可以出问题的地方都想清楚,但是感觉-fsanitize=address和ulimit -v所导致的问题是真的难以预料啊。

zbw考了231分,我身边的大佬们大多都在225-260这个范围内。问过身边的大佬之后我发现:这场的分差是非常小的,第二天才是决定名次的关键。Day 1的题目并不是适合我的类型,考察了很多我最不熟练、最不擅长的知识。在这样的不太对我胃口的场,还是经历了我从未遇到的问题的情况下,还能够苟到集训队线,也算是运气比较好了。

Day 2 考试日

今天我一看题就看到T1是一个我以前见过的模型。看完T2之后,大概已经过去了20分钟了。又看到T3有一个弦图,而且题目看起来很像NPC问题的风格,一副不可做的样子。

T1和如下搬过多次的模拟赛题目类似:

给定正整数\(n \leq 20\)和\(n\)个水桶,容量分别为\(a_1, a_2, \cdots, a_n\)升。现在你每次可以选两个或一个水桶,在这些水桶里面总共取掉\(k\)升(\(k\)是指定的,但每次操作的\(k\)的值一样)。问最少用几次才能把水桶里面的水全部取完。

此题需要如下的结论:

若\(\sum_{i = 1}^{n} d_i = mk, m \in N^*\)且\(m \ge n - 1\),则可以用\(m\)次操作把所有水桶取掉。

而那个模拟赛的题目还不需要给出操作方式的构造,结论很容易猜。这个题目比那个题目好的地方就是:要求选手要给出该结论的构造证明,避免了猜结论选手拿到高分。我使用了这个题目的结论,结合了bitset优化后的背包算法,在大约1h20min的时候写完了此题,并手写了spj,测试了样例。

接着我开始做T2了。我先根据题意,想了一个单组\(O(n 2^m poly(m))\)的做法。一看部分分,发现只有几个点是\(m \leq 2\)的,且这些点都包含在\(maxh \leq 2\)的里面。那种想到一个新的算法却拿不到分的感觉很难受。

接下来我想到了三种思路:

思路一:找状压dp中第二维的性质。

思路二:直接把性质比较好的树带进去,来得到答案为Almost Complete的必要条件。

思路三:如果要Almost Complete,那么一定会在\(\sum n\)和\(\sum m\),\(maxd\)的量上有一些限制。因此有可能一个看似复杂度比较高的搜索算法是可以得到高分的。

性质四启发我,只需先考虑二叉树呈一条链的情况下是否是Almost Complete。如果不是一条链,则它必定存在一个深度最浅的分叉点\(u\),而这类树只能由一条链或者恰好只有\(u\)的儿子个数为\(2\)的树来生长得到。于是只需做很多次树形dp即可得到这16分。

接着我试图考虑如果我们考虑固定这棵树的深度最浅的一个分叉点\(u\),而研究\(u\)分叉出的两棵子树更复杂的情况,那么会推出什么有用的性质。可是我发现似乎只有它的儿子中有一个点是叶子的情况下,所得到的性质比较强,反之得到的性质会很弱。进一步思考后我发现固定了这个最浅的分叉点\(u\)和它的某个作为叶子的儿子\(v_1\)之后(设另一个儿子是\(v_2\)),就变成了一个以\(v_2\)为根的子问题了。因此我大胆地猜了一个结论:我们只需考虑去掉某一条链之后,剩下的点都是叶子的情况。

草稿纸已经用了三张,比赛只剩不到一个半小时,T2只写了简单的代码片段,T3还一分不会。

是继续想,还是放弃?是沿着结论继续做,还是验证结论正确性?

脑袋一团浆糊的我做了一个现在看来不太明智的结论:先写T3第一个subtask的乱搞。我写了一个明显是错的建出完美消除序列,然后乱dp的做法。

果断放弃了T3,放弃T2正解,开始写T2的特殊性质四!我先写了判断数据性质的代码,再写了建立trie树这一部分,最后写两次树形dp的部分。写完的时候还差不到20分钟,100多行代码都未经测试。

我用我后16分的方法去跑样例一、二、三,发现它RE了。对着代码看了一下,发现我建trie树的时候的那个递归爆栈了,而且里面数组下标的顺序还写反了。但我把样例一、二、三、四并起来的时候它又WA了。数组清空了过后,总算过了所有满足特殊性质四的样例,但此时比赛只剩大概5分钟了。

手造数据对拍,改掉眼查出的一行bug,加上文件输入输出。关掉gedit,关掉terminal,离场。

问了一圈其他同学,发现他们都测了T1的极限数据发现会卡常,而只有我没有测。又因为紧张我忘记自己竟然加了文件输入输出。当时感觉自己真的是要退役了,自闭程度不亚于考完2019数学高联对完答案之后的感觉。不过问到zbw集训队稳了,我主要还是为他感到高兴吧。

期望得分:\((85 + 15 * 20\%) + 16 * 50\% + 0 = 96\)

实际得分:\(100 + 40 + 0 = 140\)

最终NOI2020排名:rk36

最终CTT2020&集训队作业&CTS2020综合排名:rk18

结果发现那些说T1卡常的人可能是自己常数写大了,实际上bitset的速度并不慢。T3乱搞没有拿到分数是肯定的,但是神智不清的我竟然在最后时刻把T2的性质四写对了,还没有忘记文件操作(不然你们会看到《梦结束的地方——NOI 2020 退役记》),最终勉强地进入了集训队。

讲题的时候发现,考场上我T2所猜的结论是对的,进一步思考有可能能得到正解,也有可能来不及打完暴力。但我的水平没有达到能够切换成更冒险的考试策略的程度,这样的结果对我来说只能接受。

Day 3 国家队答辩

我作为离国家队遥不可及的选手去围观集训队答辩,还留下了一篇写得很草率的论文供在座的选手翻看。这次答辩给我的第一印象是:评委并没有提出质量很低的问题,相反高闻远提出的问题都很有水平。

其次在答辩的六人之中,rk5周任飞的英语非常标准,论文准备非常认真,而且回答评委问题时的台风堪称完美。他英文自我介绍里面体现的学习经历,大概是浙江强校的集训队选手的普遍写照。他的答辩水平远超前四中的两个人,可这样一个能力很强的人,却只是因为NOI D2的策略失误而错失国家队,使我感到很遗憾。

但集训队综合排名前十的人都有相当的水平,最终的前四却是需要运气和灵感、策略和状态。这是我们需要认识的事实。我们只能希望他的遗憾会在之后的学习中称为动力,正如他对评委的问题做出的回答一样吧。

开始是为了结束

在《NOI 2019 游记》中我写道:

"NOI2019的落幕,意味着我完成了这道题的又一个subtask。之后的集训队作业,thu/pku集训,NOIP2019,WC2020,SHTSC2020,NOI2020。我会认真地、尽力地去参加。我知道凭我的实力是进不了前15的,我也并不是等待奇迹的出现,我只是想,从容地走完这条属于我自己的路径。"

现在看来,我走完了这条属于自己的路径,但“跌宕起伏”代替“从容”成为这条路径的主旋律。我经历了CF Rating从2482升到2737再降回2505再升到2601的奇妙体验,体会了某次联测别人会两题而我会0题的失落。数学集训时小小的担忧,多校联测rk4时小小的得意,都是这条路径上最美丽的节点。从此,再也不会在22:30打CF和9:30睡觉6:40起床的作息之间摇摆不定;从此,再也不会在最后5分钟用颤抖的手写完代码,忐忑离场。

唯一的不同在于,高一时的训练为了证明自己能行,证明上海能行。高二时的训练不仅发自感性,更发自对OI的已有认识和再度认识的渴望。

因此,我认识到我对EFZ的OI组有着自己的价值,特别是一位决定孤注一掷地去拼集训队的人,但这种价值不能脱离OIer的身份而存在。我决定和大家一起集训,待在同一个机房,做同样的事情。我在暗地里了解那位选手的训练情况和生活情况,和他保持持久的联系,做他唯一的陪伴。我与别的OIer一起出题,把出题当成是给予选手优秀训练平台的机会而不仅是展示自己水平的方式,延续着华二在六校联测的地位。但这一切的基础是:我是一个OI选手。

因此,我把我做过的题,看过的比赛榜单,与选手交谈过的话题都看作是丰富的感性材料。我把它们看成OI的一部分,而不仅是学习内容的一部分。在每一个空闲的夜晚,我尝试着把这些材料重组成一条因果关系链,尝试着把它们组织起来,上升对OI的认识。

我的NOI之旅在长沙开始,也在长沙结束。而从NOI2018开始的NOI之旅的最终目的,不正是为了能够立足于选手的身份看遍OI的万千风光吗?

结束是新的开始

在NOI2020过后,我的身份可能从一同训练的选手,变为了学长,再变为退役OIer,甚至变为出题人。我也许可以做同样的事情,但身份的改变,使我再也不能以同样的心态去做那些事情了。闭幕式结束过后,我大概认识到这是我学长身份的真正开始,而我终究要适应这个身份。

我能做的事情还很多,在疫情和-OH计划的打压下我需要做的事情更多。趁我和其他OIer的共情还没有消逝的时间下赶紧做点什么,成为了我的责任和心愿。

我从OI训练的实践中,产生了对OI的感性认识。但这一感性认识能否上升为理性认识,并反作用于作为学长的实践呢?这在我心里是一个很大的问号。

开始是为了结束,结束是新的开始——NOI 2020 游记的更多相关文章

  1. TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。

    整体思路: 创建本地新分支 (create branch)  -- 切换到本地新分支工作 (switch/checkout) --提交修改 (commit)  -- 推送到远程新分支 (push)  ...

  2. 2019元月新SAP项目落地记

    2019元月新SAP项目落地记 ~ 追求绝对安全感,要求无缝衔接 ~ 元旦刚过,我就开始了新SAP项目的寻找之旅. 笔者追求绝对的安全感,以及新旧项目之间的无缝衔接.即不能让自己长时间的闲着无项目做, ...

  3. TMS WEB Core v1.2预览版:新的Electron应用程序支持

    2019年2月20日,星期三 几个月前,我们已经开始与Electron进行实验.在工作概念验证之后,我们的目标是为Delphi开发人员尽可能多地包装Electron API.但当然不仅仅是可以使用的E ...

  4. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

  5. window.open()打开新窗口教程

    使用 window 对象的 open() 方法可以打开一个新窗口.用法如下: window.open (URL, name, features, replace) 参数列表如下: URL:可选字符串, ...

  6. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

  7. DeepMind背后的人工智能:深度学习原理初探

    去年11月,一篇名为<Playing Atari with Deep Reinforcement Learning>的文章被初创人工智能公司DeepMind的员工上传到了arXiv网站.两 ...

  8. js-权威指南学习笔记2

    第三章 类型.值和变量 1.JS的数据类型分为两类:原始类型(基本数据类型/不可变类型)和对象类型(引用数据类型/可变类型). JS中的原始类型包括数字/字符串/布尔值,还有两个特殊的:null和un ...

  9. 《learning hard C#学习笔记》读书笔记(19)多线程

    19.1 多线程编程知识 19.1.1 进程与线程的概念 进程: 可以理解为一块包含某些资源的内存区域,操作系统通过进程方式把它工作划分为不同的单元. 一个应用程序可以对应多个进程. 线程: 线程是进 ...

随机推荐

  1. 加速OSD的启动

    ceph是目前开源分布式存储里面最好的一个,但是在高负载下会有很多异常的情况会发生,有些问题无法完全避免,但是可以进行一定的控制,比如:在虚拟化场景下,重启osd会让虚拟机挂起的情况 重新启动osd会 ...

  2. backfill和recovery的最优值

    ceph在增加osd的时候会触发backfill,让数据得到平均,触发数据的迁移 ceph在移除osd的时候需要在节点上进行数据的恢复,也有数据的迁移和生成 只要是集群里面有数据的变动就会有网卡流量, ...

  3. Python面试题_中级版

    Python 面试题 1.Python是如何进行内存管理的 对象引用机制.垃圾回收机制.内存池机制 1.1对象引用机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数. 引 ...

  4. [LeetCode题解]160. 相交链表 | 双指针 + 哈希表

    方法一:双指针 解题思路 假设链表存在相交时,headA 的长度为 a + c,headB 的长度为 b + c.如果把 headA 连上 headB,headB 连上 headB 的话,当遍历这两个 ...

  5. Web安全常见漏洞修复建议

    转载地址:https://security.pingan.com/blog/17.html SQL注入 在服务器端要对所有的输入数据验证有效性. 在处理输入之前,验证所有客户端提供的数据,包括所有的参 ...

  6. mysql case when语句的使用

    case具有两种格式.简单case函数和case搜索函数. 简单函数 CASE [col_name] WHEN [value1] THEN [result1]-ELSE [default] END 搜 ...

  7. redhat-DHCP服务的配置与应用

    DHCP服务器为客户端提供自动分配IP地址的服务,减轻网管的负担 首先 rpm -q dhcp 查看是否安装dhcp yum -y install dhcp进行安装 安装完成 dhcp服务配置 dhc ...

  8. CentOS 6.10 安装mysql

    1.检查是否安装有mysql rpm -qa | grep mysql 使用yum remove 包  的方式删除干净 2.下载yum Repository wget -c  http://dev.m ...

  9. 仿射密码-fanfie--affine

    仿射密码 仿射密码 是一种专情密码,一对一替换 ~~ 加密函数是 e(x) = ax + b (mod m) 其中a和m 互质,m是字母的数目. 解码函数是 d(x) = a^-1(x - b) (m ...

  10. jenkins、gitlab配置CI/CD

    1. 在gitlab中创建好项目(gitlab的安装和基本使用这里不在说明) 2. 创建jenkins任务 jenkins 需要几个插件请先安装好 - Git plugin - GitLab Plug ...