GDOI 2025 总结
联合省选历程
Day 0
试机。好像我们机房监考很多纪中学长,比如古神。
电脑居然是 Win11 系统,12 代 i5,这比评测时的 CPU 性能要强,估计得注意常数。
Win 系统下配置的很好,用的是很新版本的 g++,甚至有 clang。VSCode 有很多插件,甚至还有 cph,亏我之前一直担心正式比赛没有 C/C++ 插件用。
Linux 是 VB 虚拟机,发现共享文件夹有一个问题:在 Geany 和 Gedit 里面没法保存文件到共享文件夹,本来打算虚拟机 + Geany + 共享文件夹,看来是不行了,决定比赛改用 VSCode,在主机里面用着舒服,还可以调试。
尝试写一个 NTT,早上没复习到,发现完全不会写。尝试手推,失败。
Day 1
第一题让我想起来前几天 ABC147F,当时做了这题之后问了 IR 是不是连续整数中选 \(x\) 个的和,上界和下界之间的数都能取到。于是大胆猜测在上界和下界中的都能取到,再猜了一下如何求上下界,发现似乎所有数都选 l2,按照 l2 排序之后前若干个选 r1 个,后面全选 l1 个,应该是最优的。还保守地写了一个暴力检验了一下结论,但是感觉 \(n=4\) 太弱了,检验不出来。所以直接写正解,50 分钟左右过了。
我觉得优势在我。开始做第二题。第二题看起来过于神秘,直接想性质。这时候开始很混乱,又有点急,沉不下心。想了很多个方向,但是都假了。想过根号分治,想过定期重构,想过线段树合并,想过离线扫描线,都做不了。有一个瞬间想过 bitset,不知道当时怎么算的,算出来空间会炸(实际会用一千多 M 大概,挺反常的)。最后破防,直接写了 \(O(q(n+m))\) 的暴力,甚至没想过换成 \(O(qn)\),因为当时以为换了也不会快多少,可能会多一些细节,怕写挂。
这样第二题上花了很多时间。实在没想法了就去看第三题,第三题更是奇怪,让我这种急性子选手没法沉下心推性质。最后写了个暴力就不想想了,而且也没什么时间了。
Day 2
第一题怎么感觉好熟悉(其实是曾经 ABC 场切的 F 题,不过当时好像写的双 log,半个小时就过了)。猜了一手,可以按照时间排序一个一个做,然后貌似就变成线段树二分 + 线段树维护一些信息的水题了?怎么省选 Day2 T1 这么水?
然后有点愚钝,直接以坐标轴建立线段树,导致复杂度为 \(O(n\log V)\),还难写,写完过不了样例一度以为写假了。节点不知道够不够,也不知道能不能过。在考场的电脑上面本地跑了 2.1 s,感觉没救了,但是在 NOI Linux 里面,发现貌似 Arbiter 是按照 user time 来计算的,这么说还有机会?
2 个小时才过,研究这个常数研究了半天,2.5 小时的时候放弃了,被卡常就被卡常吧,我后两题还是要做一做的,万一输在后两题呢?结果研究第二题半天,一档性质都不会。第三题也是,失败离场。
Day 3
QAQ 回去学文化课了。
P11831 [省选联考 2025] 追忆
看了一下题解,好有道理啊,怎么没想到呢?
首先这个问题不弱于 DAG 上判断连通性,而这个问题只能用 Bitset 做,所以这题应该要用 Bitset。
首先用 Bitset 可以预处理出任意两点的连通性,再考虑 \(a\) 的限制,仍然考虑用 Bitset 求出哪些点的 \(a\) 在 \(l\) 到 \(r\) 之间。考虑分块,每根号个一块,第 \(i\) 个 Bitset 维护出 \(\{j\vert a_j\ge i\sqrt{n}\}\) 的信息,这样查询的时候,整块的直接差分(异或)一下就可以求出,散块可以 \(O(\sqrt{n})\) 求出。
这样可以得出最后的限制 Bitset,设其为 \(d\),考虑要求找出 \(d\) 中最大的 \(b\)。仍然和 \(a\) 一样分块维护 \(b\) 的后缀信息。用手写 Bitset,考虑双指针。枚举 \(i\) 表示考虑了 \(d\) 的前 \(i\) 个 unsigned long long
,再维护 \(j\) 表示 \(b\) 的后缀 \(j\) 中有答案。每一次检查 \(d\) 的第 \(i\) 个 ull
与 \(b\) 的后缀 \(j+1\) 的第 \(i\) 个 ull
是否有交,若有,则将 \(j\) 加 1。
总复杂度是 \(O(\frac{n(m+q)}{\omega}+q\sqrt{n})\) 的,看着就很正确。