GZOI 2026 Day2
其实这个是广州市赛,并不是贵州省选/hanx
总结
预期:100+70+[20~? ]+0=[190~? ]
实际:50+95+0+0=145
比赛过程
由于上一天的经历,我决定先降低自己的预设分数,确保能获得 100pts 以上即可,甚至做好达不到 100pts 的准备。
今天的 T1 明显难于昨天 T1,爆搜的复杂度有点错啊,加上剪枝,在加个 map 标记一下,大样例跑了 30ms,这对吗?虽然只有一个大样例并且很水,不过我认为这只是 T1,所以并没有在继续管他,往下继续做,此时过去 30min,预期得分 100pts。
T2 当 \(n\) 是偶数似乎比较简单,直接 \(dp\) 难道就行了?写,过了大样例。接下来轮到 \(n\) 是奇数,想着先写下暴力,这样方便验证正确性,因为大样例是偶数。问题是我的暴力写假了,并且始终找不到问题!虚空调试好久,此时已经过去了 1h10min,预期得分 120+pts。
往后看看吧!T3 博弈论有点神秘啊,想了一想,好像可以分析出一些性质,先搁置一下吧,先去看 T4。
T4 题面怎么这么猎奇,被吓到了,好像要用串串的技巧,算了,先不管了,回去做一下 T2,T3。
T3 似乎比 T2 好做?思考思考,推一推,发现了关键性质,但似乎在 2 进制上的判定上有些小问题(这是后话),为了验证结论开始打表,然后开始写,由于脑残没有想到怎么区间数颜色,只能乱搞,搞完之后 只剩 55min 了,预期得分 140+pts。
T2 好像又发现写神秘性质,加上些神秘预处理好像可以 \(O(n^2\log n)\),但是似乎来不及了,写了个 \(O(n^3)\) 加上些乱搞,期望得分 70pts,期望总分 190+pts,时间还剩 30s。
最后 30s 发现 T1 代码忘记写 freopen,赶紧加上。
结果
T1 还是被卡飞了,T2是错解,被汪总 hack 掉了,T3 怎么爆零了(又没写文件)?
提升
- 心态还有策略今天有很大提升,少了无用思考,并且在代码调不出来的情况下果断跳题,因为在平时就发现了我如果长时间调代码会头晕。
题目
数字迷宫
题目大意
在 \(n\times m\) 的网格中,从起点走到终点,每步向上下左右移动一格。进入格子 \((i,j)\) 后,价值更新为 \(b'=(b+a_{i,j})^2\bmod p\)。初始价值为 \(w\),起点不额外结算价值,要求到达终点时价值恰好为 \(q\)。求不超过 \(16\) 步的最短路,不存在则输出 \(-1\)。
\(T\le 5,\ n,m\le 100,\ p\le 10^7\),\(p\) 为质数,每组读入地图与起终点。
解题思路
正常用 dfs 爆搜复杂度是 \(O(4^{16})\),剪枝是过不去的,考虑使用 meet-in-middle,先反向跑,然后用 map 计入状态,再正向跑一遍。但是反向跑的状态数可能很多,因为每个点的状态其实是 \((i,j,val)\),对于一个点 \((x,y,val)\),它由周围 \((x\pm 1,y\pm 1,\sqrt{val}-a_{x,y})\) 转移过来。
不过我们有一个结论:对于任意 \(a\),满足 \(x^2 \equiv a \pmod p\) 的 \(x\) 不超过 2 个。
对于 \(x \in [1, \frac{p-1}{2}]\),有 \(x^2 \equiv (p - x)^2 \pmod p\)
所以对于 \(a \in [1, p]\),存在 \(x\) 满足 \(x^2 \equiv a \pmod p\),则 \((p - x)\) 也是一个解。那么要想解的个数不超过 2 个,就必须有:
\(\forall x \in [1, \frac{p-1}{2}], x^2\) 两两不同。
考虑反证。
若存在 \(a, b \in [1, \frac{p-1}{2}]\),\(a \neq b\),\(a^2 = b^2 \pmod p\),则有 \(a^2 - b^2 \equiv 0 \pmod p\)
由 \(a, b\) 的取值范围易知无解,故 \(x^2\) 两两不同。
知道这个结论之后,说明反过来跑的时候每个点最多由两种状态转移过来,所以这就保证了反向跑的复杂度是 \(O(2^{8})\)。
启发:
-
要练一练 meet-in-middle。
-
需要积累二次剩余相关结论(需要保证 \(p\) 是质数,因为在证明 \(a^2-b^2\equiv 0\pmod p\) 的时候需要保证 \(p\) 不是 \((a+b)(a-b)\) 的因数):
-
\(\forall x \in [1, \frac{p-1}{2}], x^2\) 两两不同。
-
\(\forall x\in [1,p]\),\(x\) 是完全平方数的概率是 \(1\over 2\)。其实就是在 \([1,p]\) 有 \(p-1\over 2\) 个数是完全平方数。这是因为对于每个完全平方数 \(x\) 它最多只有 2 个根,并且\(\forall x \in [1, \frac{p-1}{2}], x^2\) 两两不同。
-
序列划分
题目大意
给定严格递增序列 \(a_1 < a_2 < \cdots < a_n\)。
将所有元素不重不漏地分成若干个长度 \(\geq 2\) 的等差子序列,子序列不要求连续。
最小化所有子序列公差的最大值;无法划分则输出 \(-1\)。
\(n \leq 3500\),\(a_i \leq 10^9\)。
解题思路
很显然,我们最多只会分成长度为 2 的还有长度为 3 的。
法一:
有一个显而易见错解 1:如果 \(n\) 是偶数直接两两分组,如果 \(n\) 是奇数取一个三元组后在两两分组。
这太容易 hack 了。
还有一个考场上想到的不怎么容易被 hack 的错解 2:如果 \(n\) 是偶数 DP,否则取一个三元组后再 DP,这里的 DP 就是看看这个数接/不接在上一位。
这个有什么问题呢,它无法跨过一些没有的点,如果 \(n\) 是偶数也会出现有选 3 个情况,比如说:
5 10 12 13 15 100 101 102
最优解是: 5 10 15,12 13,100 101 102
但是错解跑出来的是:5 10,12 13,15 100,101 102
我们重新观察复杂度,并且最小化最大值这种长得如此像二分答案。我们就去做,二分最大公差 \(D\),将相邻两个数差值 \(>D\) 的割掉,这样就会分成若干个连通块,在对连通块内使用错解 1 的方法,这样就对了。
时间复杂度 \(O(n^2\log n)\)
法二:
一个重要的性质就是长度为 2 的两两不交,长度为 3 的也两两不交。
考虑 DP,设 \(f_{j,k,0/1,0/1}\) 表示长度为 2 的段和长度为 3 的段的末尾位于 \(j,k\),两个段是否已经填完,其中 \(k\) 是第三段的结束位置或者第一个位置。转移如下:
当前位置 \(i\),上一个状态是 \(f_{j,k,0/1,0/1}\),其中 \(j,k\) 其中一个等于 \(i-1\)。
填在长度为 2 的段后面:\(f_{j,k,0,0/1}\to f_{i,k,1,0/1}\)。
填在长度为 3 的段后面:\(f_{j,k,0/1,0}\to f_{j,p,0/1,1}\),\(p\) 表示 \((a_k,a_i,a_p)\) 这组三元等差数列的最后一位。
另开一段长度为 2 的一段:\(f_{j,k,1,0/1}\to f_{i,k,0,0/1}\)
另开一段长度为 3 的一段:\(f_{j,k,0/1,1}\to f_{j,i,0/1,0}\)
该做法常数较大,需注意实现时要避开 map 等大常数 STL,建议使用 unordered_map 或手写哈希表。
时间复杂度 \(O(n^2\log n)\)。
博弈开启
题目大意
对每个询问区间,Alice 先手,双方轮流选择:
- 删除一个数;
- 重排成一个此前未出现过的序列。
相同的数不区分,不能操作的一方失败。
求双方最优策略下的胜者。
\(n, Q \leq 10^6\),\(1 \leq a_i \leq n\)。
解题思路
设 \(P\) 是可重集排列数,\(P={n\choose n_1,n_2,n_3\cdots}\)。
容易发现,如果 \(P\) 是偶数,那么先手必胜,因为如果它删掉一个数是必败的,它可以选择重排将删掉操作留给后手。
那如果 \(P\) 是奇数呢?不妨把 \(P\) 展开:\(P={n\choose o1}{n-o1\choose o2}{n-o1-o2\choose o3}\cdots\),并且 \(P\bmod 2=1\),这要求 \({n\choose o1}\bmod 2=1,{n-o1\choose o2}\bmod 2=1,{n-o1-o2\choose o3}\cdots\bmod 2=1\)。
补充一下 lucas定理:
写成二进制位:
n : 1 1 0 0 1 0 1 0
m: 0 1 0 1 0 1 0 1
\({n\choose m}\) 就是每一个二进制位进行组合计算,因为 \({0\choose 1}=0\),所以如果要求 \({n\choose m}=1\),意味着 \(m\) 在二进制位下就是 \(n\) 在二进制位下的子集。
回到原式,\({n\choose m}\bmod 2=1\) 意味着 \(n_1,n_2,n_3\) 都是 \(n\) 的子集,且它们不交,并且它们的并等于 \(n\)。满足以上条件就是后手必胜。
现在题目就转化成让你求区间内不同颜色的个数的在二进制位下是否有交。首先统计区间内这些颜色是什么,由于二进制位的限制,只会有 \(\log n\) 种颜色。将询问离线,从左往右扫,用 set 维护二元组 \((c,pos)\) 表示 \(c\) 颜色最后一次出现的位置,这样对于每个区间就可以做到 \(O(\log^2 n)\) 找到区间内的这些颜色是什么?对每个颜色开个 \(vector\) 维护位置,在 \(vector\) 上二分就能算出区间内该颜色个数,再对每种颜色个数算算它们二进制位下是否有交,总时间复杂度 \(O(n\log^2 n)\)。
前缀之间
题目大意
所有非空前缀组成去重集合。每个前缀 v 有价值 F_v,沿前缀延长的方向不增。
令 H_v 为以 v 为前缀的最长输入串的完整长度。
前缀 u 对 v 造成贡献,当且仅当
对每个 u,求用最少多少个前缀,恰好覆盖它能贡献的所有前缀。

浙公网安备 33010602011771号