SCOI 2019 游记

写在前面

其实冬令营之后就有一些想说的内容,由于心情原因没有写出来。PKUWC 失误频频,唯一可能还有点价值的就是 Day2T3 计算几何推了 76 分出来。NOIWC 更是无心再谈,感觉是被提答送走远了。不过归根结底还是自己的问题。

转眼间快三个月过去了,期间一直在广泛做题,也学了一些新的算法。有没有成效,就在省选考场上验证吧。希望不要再向去年那样颓废了。

笔试面试差评。

4.12 (Day 0)

下午笔试。

100 道单选题几分钟就写完了,当然还是喜闻乐见地出了一些小锅。一些经典的锅见知乎 如何评价 SCOI2019,这里就不再赘述了。

4.13 (Day 1)

拿到题之后打算顺序开。

看完 T1 瞬间整个人都不好了。为什么一来 T1 就感觉不可做啊?于是先打了个 30 分的模拟。正准备弃疗的时候突然发现第二档部分分也满足 (M leq 10),于是简单改了下,写了个lower_bound,这样应该就有 50 分了。

这时 T1 暂时没有更好的想法。时间还比较多,于是我把 T2 和 T3 都浏览了一遍。发现 T3 好像是个数学题,似乎可以推一推,于是准备优先写 T3。不过在这之前,我得先看一下 T2 好不好拿分。

结果看完 T2 后只胡了一个高复杂度的做法,而 (q) 的数据范围出到了 (10^6),瞬间就自闭了,不过这种做法说不定能骗点分。然而因为并不想优先开这个题,于是先打了个 20 的暴力就跑路去看 T3 了,决定等有时间再来写 T2 的部分分。

T3 推了一下,一个显然的想法是设 (f_{i, j}) 表示超矩形的前 (i) 维坐标乘积(即 (prod_limits{x = 1}^i a_x))为 (j) 时所有 (prod_limits{x = 1}^i a_x^{b_x})的和,转移为 (f_{i, j} = sum_limits{d |j} f_{i - 1, d} imes left(frac{j}{d} ight)^{b_i}),发现转移是狄利克雷卷积的形式,因此最终要求的 (f_k) 即为 (k) 个形如 (g(x) = x^{b_i}) 的函数的狄利克雷卷积。想了下发现由于许多 (b_i) 是相同的,并且 (b_i) 的种类数不超过 (5),因此可以将函数按 (b_i) 分组,单组内倍增,最后再合并。根据杜教筛的那套理论,可以只存所有函数的 (O(sqrt n)) 个前缀和值,再构造一下杜教筛就可以较快地做单次合并卷积了。感觉应该跑得很快,于是准备试着写一写。写写调调了很久后过了样例,尝试着造了一组最大数据跑一下,结果要 10s 才能跑出来。又想了许久,想不出更好的做法了。我决定检查下我的写法或是卡卡常数。

此时我就走上了一条不归路。当时的我早已将 T1 抛在脑后,仅仅在 T2 和 T3 中抉择了一下,认为卡过 T3 会现实一点,并且更容易得分,于是整场考试的后半部分我一直在卡 T3。结果我并没有成功。当考试结束时,最大数据还是需要 6s 才能跑出来。

最终我 T3 的得分仅有 50,这和 30 分的暴力仅有 20 分的差距。这值得吗?我不得而知。

update:今天用 min_25 筛写了一发 T3 发现 0.2s 都不到就跑出来了?自闭了。

于是 Day1 我的分数并不高,仅有 50+20+50=120。

出了考场就听说 T1 可以找规律,再一次自闭了。下午果然看到了 T1 一大片的 100 分。

当天下午我的心情一直很沉重,于是面试也不太想说话,这导致我面试成绩也不算太高。因为心情原因,晚上也不太想吃东西,我只希望明天能发挥好一点。

4.14 (Day 2)

拿到题之后还是打算顺序开。

T1 读了两遍冗长且花里胡哨的题目描述后终于清楚了题意,很快就胡了一个单次询问 (O(n)) 的最大连续和做法。想了一会发现从最大连续和的角度考虑似乎不好做,于是把叉积式子拆开,发现答案式子就是两个前缀和的点与询问点的叉积相减,只需让前面的叉积尽可能大,后面的叉积尽可能小。于是求出所有前缀和点构成的凸包,再把所有直线按极角排序后直接写个类似于旋转卡壳的东西求离直线的最远点似乎就做完了,除了求凸包和直线排序之外复杂度都是线性的。很快地写完后和暴力连续最大和拍了一下,没问题后测了组大数据,发现读入有点慢,于是加了个读入优化就跑得飞快了。

这时我的心情稍微放松了一点,打算还是先浏览一遍 T2 和 T3。

结果发现两道题似乎都不太可做,于是我又开始慌了。T2 的 (n) 的数据范围不超过 (2000),似乎有可以想一想的空间,于是决定先看 T2。

T2 想了很久枚举中间的合法点 (x) 然后遍历一遍,再套个容斥之类的东西的做法,结果因为限制太多,无果。不过可以发现对于单个合法的点集对 ((U, V)),所有合法的点 (x) 一定构成一个连通块,即一棵树。此时突然想到了今年 PKUWC 上关于树的计数的小 trick,发现好像以每个绿色点作为合法点遍历一遍求出所有答案的和,再以每条两段都是绿色点的边作为合法边遍历一遍求出所有答案的和,两者相减即可让每一个合法的点集对 ((U, V)) 唯一出现。这样复杂度刚好是 (O(n^2))。想到这十分激动,于是赶快按照想法敲了份代码,结果却打死过不去大样例。此时已经 11:00 左右了,为了节约时间,我决定肉眼调试,然而看了几遍并没看出问题。无奈只好又写了份暴搜,小数据拍出了问题后,发现结果是一个 SB 错误,改了后终于过了大样例。

update:听说这个 T2 是 [十二省联考2019]希望 那题的弱化版。服了。

我长舒了一口气,现在预计已经拿到了 200 分,但感觉今天大众分应该也会很高。于是为了防止挂分,我并没有急着去看 T3,而是又拍了一下两个题,然后造了点最大数据,在 Linux 下测了下时间和空间。测试无误后,我的心情放松了许多。

T3 被题意吓到了,于是打了个 20 的暴力时间就差不多到了。

刚出考场,就听见许多人互相交流分数。我听到了许多的 240,突然反应过来 T3 的 (W = 0) 的部分似乎写个线性基就可以了,于是又白丢了 20。我甚至听见了 270 分的声音,心里有点慌。

下午出分,还好我没有挂分,拿到了 100+100+20=220,这个分的排名在今天似乎比较靠前。正式营员今天的最高分是 240,不过听说非正式营员里倒是出了 270 的神仙。

我简单算了一下,自己应该是在省队线内了,本来这是一件令人高兴的事情,然而我却并没有表现出太多的喜悦,相反,我总感觉有些失落徘徊在我的内心,是压力所迫,也可能是失误所致。观物知情,相信灰色格调的实验楼内景也在应和我的感受。

在离开时,总榜还未公布,但也没有太多值得期待的了。

后记

省选虽然已结束,但在之后短暂的三个月内,各项考试将会接踵而至,希望自己都能够全力以赴。

加油吧。

原文地址:https://www.cnblogs.com/ImagineC/p/10682026.html