【比赛游记】FJOI2020 打六题挂四题记
上接 FJOI2019 瞎打记 和 NOI2019 打铁记。
day 0
早上睡到很迟,下午看考场,很劲爆,不用 FrC 提交了。打了一个 NTT(FJOI 怎么可能考)和一个 SA 然后走了。
晚上打模板,复习资料什么的。
我写下这句话的时间是 00:48。
++FJOI2020.rp
当 NOI2019 落幕时,在广州二中的颁奖典礼门外,我拭净眼角的泪水后
哐当一声,有一个声音告诉我:「你再也不能笑着说『还有下一次』了」。
day 1
早上进校门的时候,测的体温是 37°,很可怕。
进考场,看题,T1 费用流原题,在哪本书里好像有印象。写完后大概是过了四十分钟这样。
T2 看了一会儿发现要个圆方树,很吓人。赶快回忆了一波 Tarjan 怎么写,然后建出来圆方树。
然后就不会了,他要求的是点,但是如果考虑边呢?好像可以启发式合并,那就很好,可以 \(\mathcal O (n \log n)\),但是怎么把边转化成点呢。
推了一下发现很弱智,就是周围边加上自己再除以 \(2\)。大概九点四十写完了,调了调好像把样例过了,手造几组好像没错。
然后后面就在大力搞 T3,看到题立刻手玩 \(n = 4\) 时到底是哪两个比较憨批没法得到,发现是 \([3, 1, 4, 2]\) 和 \([3, 2, 4, 1]\)。
然后 \(n = 5\) 的玩不动了,赶快写个枚举全排列 check 的程序,check 就用贪心就行。
跑出来一堆,发现都有这个 \([3, 1, 4, 2]\) 或者 \([3, 2, 4, 1]\) 作为子序列(离散化后)。
那么猜想只要有这两个子序列就不行,赶快又写了一个程序直接 \(\mathcal O (n^4)\) check 是否存在这个子序列。
发现输出结果完全一致,那么猜想就得到验证了。
接下来就是计数不存在 \([3, 1, 4, 2]\) 或者 \([3, 2, 4, 1]\) 作为子序列(离散化后)的排列个数。
一开始想了一个假的 DP,想了好久大概半小时才发现是假的。后面换了个思路,发现就会做了。
就发现好像可以变成一个 \(\mathcal O (n^2)\) 的 DP 了。手动模拟了一发好像非常正确,就写了。
这个时候就有 \(50\) 了,然后回过头来看前两题。
检查了一下前两题的代码,然后 T1 不好写对拍,那么就写 T2 的对拍。
暴力就用 \(\mathcal O (n (n + m))\) 的,然后对拍写了一会儿开拍,拍了挺久都没错。
再回来想 T3,发现之前的代码甚至没有提交,赶快交了一波。
首先把那个 DP 式子试着用生成函数推了一下,推了一半发现假掉了。
然后换个思路转成一个 DAG 带权路径计数问题,但是并没有什么卵用,我要求的是一行的所有终点的答案之和。
对于某个固定的终点,我似乎可以搞出起点到它的路径条数,要枚举向 DAG 的右下方节点走了几次,然后有个卡特兰数。
虽然现在看来那个式子好像是错的,反正我就是对着它硬推,结果惨不忍睹,完全不知道是什么东西,反正也没法卷积。
然后在最后 20 min 的时候,恍然大悟这一行的所有和就是下一行的第一个数啊,瞅了瞅那张表好像确实如此,那么我就赢了啊!
仔细检查了一下式子发现有几点错误的地方,改了一下就开始码了。
要求组合数,卡特兰数什么的,因为不知道模数是多少,卡特兰数就用组合数相减来求,为了保险又写了个 Lucas 定理。
最后在结束前 4 min 惊险写完,跑了跑小数据发现没问题。就赶快提交上去了。
出考场的时候觉得我 AK 了,FJOI 居然轮到我 AK 了吗?
中午划水,顺便跟同学扯扯 T3 做法。
下午评测结果出来了,我 \(0 + 100 + 30 = 130\),顿时感觉有点离谱,但是也没那么惊讶,大概早有心理准备了吧。
于是乎申诉,于是乎嗓门就开始大了起来。毕竟如果真的是这种结果的话,要说接受我也是不会这么轻易就接受了吧。
然后过一会儿代码公示下来了,我看不出 T1 到底咋挂了。让同学说了几组数据,都没错。
同学帮忙写了个对拍,居然拍出错了,但是范围太大,但是范围一缩小,又全都是对的。
最后发现 \(H \ne W\) 的时候我就挂了,定睛一看一个 W
打成 H
了,直接结果就是 \(100\) 分没了。
好吧,这个操作,我服了。
然后申诉结果出来了,告诉我 T1 全 WA,T3 WA 了 5 个点,TLE 了两个点。
(啊对,这个就是申诉,就是告诉你评测结果,甚至是打乱的,对应不上具体测试点编号)
我猜想是 T3 前 \(50\) 分我对了 \(30\) 分,然后 \(20\) 分被卡常了,后 \(50\) 分则是他数据错了(迫真)。
于是我在机房里大吼大叫,然后在 vuq 里喷(
计算了一下,其实上了 \(200\) 分的也就三个人,而且最高分 \(210\)。
综合 CSP 成绩,省内排名是 rk8 这样,比去年的 rk16 已经好了太多了。
但是这并不意味着 day 2 能掉以轻心,毕竟去年是 day 2 T3 不知为何我校就是都很会做然后 AK 了。
nealchen 他 CSP 比我高了 \(41\) 分,这场 day 1 却比我低了 \(20\) 分,这么一来一回,他就比我高个小数点后两位级别的分数吧。
如果 day 2 要翻盘的话,那就要比 A 队那几位高个 \(45\) 分这样,说实话还真是不小的挑战啊。
相对地,如果比省队尾端低 \(33\) 分……
最后还是无事可做,在同学的安慰下回家了。然后在回家的公交车上,ustze 告诉我先输入 \(n = 6\) 再输入 \(n = 5\),我就没了。
我定睛一看,才发现多测没清空干净,爆零两行泪。
这时真相才终于大白,我想我 T3 的评测结果,很有可能是 WWWWWAAATT
吧。
是正解被卡常,DP 没完全清空(少清空一位),如果直接用正解,那还能多捞 \(50\) 分,但是我没有这么做。
jiangly 说他就不会把暴力留着,但是我一直以来都是留着暴力的。
所以说又是只要改五个字符,把 H
改成 W
,再给 N
后面添上 + 1
,我就 \(280\) 分了吧。
不过事后诸葛亮,也没什么意义了吧。不如把它当作历史的必然,接受这一切,然后再祝自己 day 2 的 RP 能高点吧。
话说,EntropyIncreaser 在 vuq 里说 T3 比「NOI2018 冒泡排序」还要高明,听了还是很惊讶的。
day 2
RP 还是低了。
开场先看了看题,T1 看起来是很变态的数据范围还巨大的 DP 优化,一眼就知道要 wqs 二分和决策单调性。
T2 是计数题,毒瘤。T3 是数据结构题,和之前在学军中学做到的那题差不多。
那么先考虑把计数题搞出来,是求把凸 \(n (k - 2) + 2\) 边形分成 \(n\) 个 \(k\) 边形的方案数。
当 \(k = 3\) 的时候就是卡特兰数,那如果 \(k > 3\) 呢?哎我草,咋还有 \(k = 2\) 的情况??
所以 \(k = 2\) 先不管,我猜出题人会更正。那么我们考虑卡特兰数就是 \(m\) 个 \(+1\) 和 \(-1\) 组成前缀和 \(\ge 0\) 的序列。
这时我回忆起《具体数学》上的,一个使用这个折线构造求出卡特兰数的通项公式的方法。
同时还回忆起在学军中学的时候有人讲过广义卡特兰数什么的,那么我不妨也朝这个方向想一想。
如果是有 \(n\) 个 \(+(k - 2)\) 和 \(n (k - 2)\) 个 \(-1\) 组成的序列,要怎么求出来呢?
这个时候一位工作人员走进来,说 \(k = 2\) 是退化的情况,没有问题,我当场就懵逼了。
说回这道题,《具体数学》上给出的方法是在尾端再加上一个 \(-1\),也就是总共 \(n (k - 2) + 1\) 个 \(-1\)。
这样它们的总和就是 \(-1\),如果写成无限循环的序列,也就是每经过 \(n k - n + 1\) 个数就下降 \(1\)。
也就是斜率是 \(1 / (n k - n + 1)\),又因为经过的点都是整点,所以折线的下包络面也应该是每 \(n k - n + 1\) 经过一个元素的。
以那个元素为终点,前面的序列就恰好满足条件,也就是说 \(\displaystyle \binom{n k - n + 1}{n}\) 种排列方式中,每种有 \(n k - n + 1\) 个循环同构的。
所以答案应该是 \(\displaystyle \frac{1}{n k - n + 1} \binom{n k - n + 1}{n}\),对着 \(k = 4\) 验证了一下,发现完全正确。
那么就很舒服,只要 \(\mathcal O (n)\) 算出这个组合数即可。当时觉得这东西应该就是学军中学讲的 \(k\)-Catalan 数吧。
写到一半出题人又进来,说 \(k = 2\) 虽然是退化的情况,但是为了你们选手好理解,特别改成 \(k \ge 3\) 了。我觉得行。
大概 8:40 写完了 T2。
然后这个 T3 我过了六个月,依稀记得点做法。
考虑如何求 mex,扫描线,用权值线段树维护每个数的下一个出现位置,在权值线段树上二分定位到第一个出现位置大于某个值的数。
然后总的 mex 区间改变次数是 \(\mathcal O (n)\) 的,这就可以对每个值维护一个动态开点线段树来回答询问了。
大力码码码,码到了 10:20 用了一个小时四十分钟才差不多码出来调完了,这波样例才终于是过了。
然后对于 T1 感觉就是 wqs 二分套决策单调性优化 DP,不过不太想写。所以给 T3 写写对拍应该是比较好的选择。
然后就写了个暴力,这题的暴力很好写。开拍也拍上了,居然没出错,就很离谱。
过了一会儿,去上了个厕所回来,还是决定写一写这个 T1。
思路非常清晰,但是转移代价的处理出了点错,还是调了一会儿,然后写了几个暴力 DP,能过样例,顺便验证一下凸性和决策单调。
然而单调栈处理决策单调性的时候,细节还是有点麻烦,又调了一会儿,大概在 11:43 的时候写完了。
然后考虑对拍,因为已经写过暴力 DP 的程序了,所以还挺顺手的,然后 \(n \le 100\) 的时候拍了四十几组,WA 掉了。
看得我傻了,换成 \(n \le 25\) 拍了几十组还是挂了,赶快搞了点输出,但是一时半会儿找不着哪里有问题,最终还是没改,直接交了。
出来的时候觉得自己应该第一题比较凉,但是第二第三题都是稳稳的,毕竟昨天是多测没清空,今天不需要清空,T3 也拍过了。
中午划水,了解到 hotwords 和一位学弟都猜出来 T2 结论了,很会猜,但是 nealchen 却没猜到,他数学这么强都没猜到。
下午评测结果出来了,我 \(0 + 100 + 20 = 120\)。又挂了 \(80\) 分,比较愣。最后发现是询问的权值忘记离散化了,低级错误。
但是综合一下我还是进队了,因为别人考得也不算高,T2 的结论不是所有人都得到了,而另两题又比较毒瘤,所以总体得分不高。
但是只有 rk6,也没能蹭进 A 队,rk1 是 xyz32768,rk2 是 Lagoon,rk3 是同学 LH,rk4 是厦门的 slz 同学。
说来还是很可惜,最差的就是 day 1 T1,就因为一个字母把全场都有的 \(100\) 分给扔掉了,加上这 \(100\) 我也就队长了。
两天都不同程度地挂了好多好多分,居然还在队里,也是很神奇,看来别人也有挂一些分吧。
也说明了我 OI 赛制的比赛还是训练得太少,挂掉的分都快有得到的分多了,要是今天 T3 数据强一点,就真的比得到的分多了。
明明是至少会做 \(5\) 题的正解的,虽然 day 1 T3 他卡我常数,但是不挂分应该是至少 \(480\) 分,但是挂得只剩 \(250\) 分,也是很惨。
既然已经进队了,虽然没 A 类有点可惜,但至少用不着抱怨了吧。
每年的省选季总是最伤感的时候。
靠着这评价可能褒贬不一的,省内的追逐战,有多少人以最不甘心的姿态离开了呢?
我想每个有梦想的 OIer 都曾幻想过在省队后的,种类繁多的比赛上大展身手,在 NOI 的赛场上证明自己的实力吧。
如果此时是高一,可能还有去体验的意义,但是如果是高二的话,即使有机会参加,那一切的流光溢彩的梦也失去了意义。
朋友们,就此别过吧,但愿多年后我们还能相视一笑。
在无限的落寞的阴影下,我仍然真心相信着,这一切都是最好的安排。
下转 NOI2020游记。