2026 联考题
第一场
- A
错因分析:没有将挖掘的性质有机组合。
正解:注意到奇数偶数相对位置不变,于是将它们分类提出,然后做归并排序即可。
总结:在草稿纸上写下观察出的性质,多想想联系!
- B
错因分析:不熟悉交互题。
正解:
-
一个朴素的思路就是枚举 \(1 \sim n\) 里的所有数,通过询问得知他们左半边有多少个位置,右半边有多少个位置,然后整体进行二分,折半递归下去直到只有一个数的时候就直接填满。这个显然无法通过。
-
考虑优化,我们发现递归时会问到一些已经得知位置的区间,所以我们可以维护两个变量来记录某个子区间内有多少位置还不知道,这样可以减少一些询问次数;同时我们发现 \(c_1\) 还没有用上,观察发现如果我们一开始构造左半边全是 \(x\),右半边全是 \(0\) 的询问,如果 \(x\) 无法填满左半边(即 \(c_0+c_1\) 之和小于 \(mid\)),说明此时的 \(c_1\) 就是右半边的 \(x\) 个数,这又可以减少一次询问。故可以通过本题,询问次数大约是 \(\sum \log n\) 级别。
总结:
- 交互题:构造询问、折半技巧
- C
错因:没想到 dp 状态定义。
正解:
-
首先我们模拟删除的过程,发现它总是形成以 \(0\) 结尾的 \(1 \to 0 \to 1 \to ... \to 0\) 的链,或者是以 \(1\) 结尾的链。我们以 \(1\) 结尾的链为研究对象,考虑定义变量 \(cnt\) 来刻画这个东西(为了确定保留点个数)。当我们遇到一条以 \(1\) 结尾的链,\(cnt+1\),否则 \(cnt-1\)。当到了某个点 \(cnt=k\),若此时还要加一,则令 \(cnt=k\) 并将这个点设置为保留;\(cnt=0\) 时同理。
-
这个模拟的过程启发我们定义 \(val_{c}\) 表示 \(cnt=c\) 时的权值之和,同时定义辅助状态 \(dp_c\) 表示 \(cnt=c\) 时的方案数(为了算贡献用)。转移时当 \(s_i=\texttt{0/?}\) 则转移至 \(c-1\),\(s_i=\texttt{1/?}\) 则转移至 \(c+1\),同时有保留点出现的时候需要额外加上 \(dp_{c} \times 1\)(每个方案贡献 \(1\))。如果 \(op=0\),方便起见(为了设初始状态),考虑钦定 \(s_1=0\),则初始 \(dp_{0,0}=1\),答案就是 \(val\) 之和。
-
这样我们便解决了 \(op=0\)。但是 \(op=1\) 怎么做呢?现在无法钦定 \(s_1\),我们只能发掘性质。具体的,因为初始状态不好定,所以我们从这里入手,令 \(f(a)\) 表示初始有 \(a\) 个以 \(1\) 结尾的链的保留点个数,所以答案显然就是 \(\min_{a=0}^k f(a)\)。因为 \(0,1\) 结尾的链互相搭配肯定覆盖的点更多,所以这个答案是单谷的,可以表示为 \(\sum_{a=0}^k f(a) - \sum_{a=0}^{k-1} \max(f(a),f(a+1))\)。
-
前面这个式子可以和 \(op=0\) 一起求出,考虑后面怎么求。我们发现这两个状态是相差 \(1\) 的,只要某一个越过 \([0,k]\) 的边界这两个状态就会合并(即变为 \(op=0\))。于是我们可以在原先状态的基础上加一维 \(0/1\) 表示是否合并,然后合并的状态就从没合并的状态转移过来,没合并的状态也是从没合并的状态转移过来,转移方程大体与 \(op=0\) 一致,只是需要写一个函数得到新的状态罢了(其实也可以不写)。实现上的细节需要处理一下 \(\texttt{1}\) 和 \(\texttt{?}\),具体见代码。初始就是 \(dp_{0,1}=1\)(初始都没有合并),其余为 \(0\),答案是两个维度的 \(val\) 之和。
总结:
- 观察:模拟过程、变量刻画、单峰/单谷性质的挖掘和表示。
- D
错因分析:单调性没观察出来,虽然想到点分治但没想到二分。
正解:显然可以二分长度。刻画一下答案,发现需要满足 \(T+\operatorname{reverse}(T)=2^{len}-1\),而且 \(dep_u+dep_v=len\),于是可以维护一个 hash 表存储这两个限制,把点分治写成一个 check 即可。
总结:
- 观察:单调性、刻画答案
第二场
- A
错因:没有想到可以翻转坐标系。
正解:我们发现这个反弹的过程,它的路径是对称的,所以将坐标系相对应的翻折过去,然后如果 \(vx,vy>0\),则它们的碰壁次数就是 \((x0+T \times vx)/n,(y0+T \times vy)/m\)。这个结果包含了角落,但是因为我们只需要知道分差,所以角落的数量会被抵消。
总结:相对思想(转换研究对象)。
- B
错因:没有完成第一步转化。
正解:
-
容易发现答案就是一段区间构成的树的叶子节点数量,因为叶子节点不会在 prufer 序列中出现,所以答案也即区间长度减去区间种类数。
-
因为有多个询问区间,自然想到可以离线下来(其实它给你 ops 也是在提示这一点),用莫队维护。
-
至于求出区间种类数,我们发现区间种类数是随着长度发生变化的,所以我们可以采用一种对长度分块的做法,就是你在莫队维护的过程中遇到一种新的颜色,就对当前长度所在的块进行累加,最后统计答案时整块加散块即可。
-
最后考虑取 \(\min\) 的限制,如果你的答案(去掉 \(r-l+3\))和颜色种类数相同,说明没有颜色超过 \(r-l+3\),此时就要加上 \(r-l+3\) 这一种颜色,否则不用加。
总结:prufer 序列结论(出现次数等于度数减一)、莫队+分块经典套路。
- C
错因:太困难了,真的。
(并非)正解:
-
看到式子首先转化,考虑邻项技巧,令 \(b_i=c_i \oplus c_{i-1} = \oplus_{j=1}^m \left( (x_j+i-1) \oplus (x_j+i) \right) = \oplus_{j=1}^m 2 \operatorname{lowbit}(x_j+i)-1\)(由于 \(x \oplus (x-1) = 2 \operatorname{lowbit}(x)-1\)),同时令 \(c_i = b_i \oplus \lfloor \frac{b}{2} \rfloor\),则 \(c_i = \oplus_{j=1}^m \operatorname{lowbit}(x_j+i)\)。
-
我们成功地将一个数转化为了一个数位(至少是 \(2^i\)),接下来就是按位考虑。对于 \(c_i\) 的某一位 \(j\),若为 \(1\) 则有奇数个 \(2^j\),否则有偶数个,我们称前者为奇限制、后者为偶限制。
-
这种东西往往只需要考虑一边,因此我们从奇限制入手。我们考虑用一个式子去刻画它。如果我们弱化这个问题,考虑 \(n=1\),有 \(c_1 = \oplus_{j=1}^m \operatorname{lowbit}(x_j+1)\)。对于 \(c_1\) 中的 \(1\) 位,我们知道若一个数的 \(\operatorname{lowbit} = 2^i\),则它必然模 \(2^{i+1}\) 余 \(2^i\)(这是最紧缩的限制),于是有同余方程:
-
现在我们有 \(n=1\) 的限制了,如何推广到 \(n\) 呢?由二进制我们联想到分治/倍增,事实上我们可以进行一个类似于线段树 pushup 的递归操作,将所有的限制合并(此时模数和同余数都会不断乘 \(2\)),然后找出一个满足所有限制的最小代表元 \(t\),同时不断累加最小的 \(S\) 和 \(m\)。别忘了检查限制是否冲突(交叉验证,类似于 cdq 分治)。
-
然后我们还需要考虑 \(n=0\) 的情形,令 \(d = a_0 \oplus t\),现在我们考虑如何将 \(d\) 放入同余类中,分类讨论:
-
若存在 \(2^i < \operatorname{lowbit}(d)\),此时 \(d\) 一定满足同余类约束,直接替换出以前的一个,\(m\) 不变,只需要将 \(S \leftarrow S+d\)。
-
若不满足,则 \(m\) 至少加两个才能保证奇偶性不变,于是我们考虑在某个同余类中选出 \(2^hu+q,2^hv+q\)(恰好加两个相差 \(2^i\) 的整数倍的数),由于 \(u=0\) 时 \(u+v=u \oplus v\),所以他们的最小和就是 \(2^hv +2q\)。又由于我们递归的过程中如果一直走 \(0\) 的一侧,那么 \(h\) 就会一直累加直到 \(2^h >n\)。故我们一定可以构造出 \(q=0,2^h\) 是第一个大于 \(n\) 的二次幂(即 \(\operatorname{lowbit}(d)>n\)),此时和取到最小,即 \(2^h=d\)。(这个真的只能感性理解,简直不是人类)
-
于是我们做完了此题,代码细节不少。但是这个在模拟赛中只能获得 22 pts,因为它只能处理单次询问,我们可以使用 trie 优化,但我懒得写了。
总结:
-
观察:式子转化思想、邻项技巧 / 按位考虑、刻画答案或限制、从特殊入手 / 分类讨论思想、构造思想、极值思想(大杂烩)
-
三个二进制知识点
浙公网安备 33010602011771号