2026 联考题

第一场

  • A

错因分析:没有将挖掘的性质有机组合。

正解:注意到奇数偶数相对位置不变,于是将它们分类提出,然后做归并排序即可。

总结:在草稿纸上写下观察出的性质,多想想联系!

  • B

错因分析:不熟悉交互题。

正解:

  1. 一个朴素的思路就是枚举 \(1 \sim n\) 里的所有数,通过询问得知他们左半边有多少个位置,右半边有多少个位置,然后整体进行二分,折半递归下去直到只有一个数的时候就直接填满。这个显然无法通过。

  2. 考虑优化,我们发现递归时会问到一些已经得知位置的区间,所以我们可以维护两个变量来记录某个子区间内有多少位置还不知道,这样可以减少一些询问次数;同时我们发现 \(c_1\) 还没有用上,观察发现如果我们一开始构造左半边全是 \(x\),右半边全是 \(0\) 的询问,如果 \(x\) 无法填满左半边(即 \(c_0+c_1\) 之和小于 \(mid\)),说明此时的 \(c_1\) 就是右半边的 \(x\) 个数,这又可以减少一次询问。故可以通过本题,询问次数大约是 \(\sum \log n\) 级别。

总结:

  1. 交互题:构造询问、折半技巧
  • C

错因:没想到 dp 状态定义。

正解:

  1. 首先我们模拟删除的过程,发现它总是形成以 \(0\) 结尾的 \(1 \to 0 \to 1 \to ... \to 0\) 的链,或者是以 \(1\) 结尾的链。我们以 \(1\) 结尾的链为研究对象,考虑定义变量 \(cnt\) 来刻画这个东西(为了确定保留点个数)。当我们遇到一条以 \(1\) 结尾的链,\(cnt+1\),否则 \(cnt-1\)。当到了某个点 \(cnt=k\),若此时还要加一,则令 \(cnt=k\) 并将这个点设置为保留;\(cnt=0\) 时同理。

  2. 这个模拟的过程启发我们定义 \(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\) 之和。

  3. 这样我们便解决了 \(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))\)。

  4. 前面这个式子可以和 \(op=0\) 一起求出,考虑后面怎么求。我们发现这两个状态是相差 \(1\) 的,只要某一个越过 \([0,k]\) 的边界这两个状态就会合并(即变为 \(op=0\))。于是我们可以在原先状态的基础上加一维 \(0/1\) 表示是否合并,然后合并的状态就从没合并的状态转移过来,没合并的状态也是从没合并的状态转移过来,转移方程大体与 \(op=0\) 一致,只是需要写一个函数得到新的状态罢了(其实也可以不写)。实现上的细节需要处理一下 \(\texttt{1}\) 和 \(\texttt{?}\),具体见代码。初始就是 \(dp_{0,1}=1\)(初始都没有合并),其余为 \(0\),答案是两个维度的 \(val\) 之和。

总结:

  1. 观察:模拟过程、变量刻画、单峰/单谷性质的挖掘和表示。
  • D

错因分析:单调性没观察出来,虽然想到点分治但没想到二分。

正解:显然可以二分长度。刻画一下答案,发现需要满足 \(T+\operatorname{reverse}(T)=2^{len}-1\),而且 \(dep_u+dep_v=len\),于是可以维护一个 hash 表存储这两个限制,把点分治写成一个 check 即可。

总结:

  1. 观察:单调性、刻画答案

第二场

  • A

错因:没有想到可以翻转坐标系。

正解:我们发现这个反弹的过程,它的路径是对称的,所以将坐标系相对应的翻折过去,然后如果 \(vx,vy>0\),则它们的碰壁次数就是 \((x0+T \times vx)/n,(y0+T \times vy)/m\)。这个结果包含了角落,但是因为我们只需要知道分差,所以角落的数量会被抵消。

总结:相对思想(转换研究对象)。

  • B

错因:没有完成第一步转化。

正解:

  1. 容易发现答案就是一段区间构成的树的叶子节点数量,因为叶子节点不会在 prufer 序列中出现,所以答案也即区间长度减去区间种类数。

  2. 因为有多个询问区间,自然想到可以离线下来(其实它给你 ops 也是在提示这一点),用莫队维护。

  3. 至于求出区间种类数,我们发现区间种类数是随着长度发生变化的,所以我们可以采用一种对长度分块的做法,就是你在莫队维护的过程中遇到一种新的颜色,就对当前长度所在的块进行累加,最后统计答案时整块加散块即可。

  4. 最后考虑取 \(\min\) 的限制,如果你的答案(去掉 \(r-l+3\))和颜色种类数相同,说明没有颜色超过 \(r-l+3\),此时就要加上 \(r-l+3\) 这一种颜色,否则不用加。

总结:prufer 序列结论(出现次数等于度数减一)、莫队+分块经典套路。

  • C

错因:太困难了,真的。

(并非)正解:

  1. 看到式子首先转化,考虑邻项技巧,令 \(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. 我们成功地将一个数转化为了一个数位(至少是 \(2^i\)),接下来就是按位考虑。对于 \(c_i\) 的某一位 \(j\),若为 \(1\) 则有奇数个 \(2^j\),否则有偶数个,我们称前者为奇限制、后者为偶限制。

  3. 这种东西往往只需要考虑一边,因此我们从奇限制入手。我们考虑用一个式子去刻画它。如果我们弱化这个问题,考虑 \(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\)(这是最紧缩的限制),于是有同余方程:

\[x_j+1 \equiv 2^i \pmod {2^{i+1}}\\ x_j \equiv 2^i-1 \pmod {2^{i+1}} \]

  1. 现在我们有 \(n=1\) 的限制了,如何推广到 \(n\) 呢?由二进制我们联想到分治/倍增,事实上我们可以进行一个类似于线段树 pushup 的递归操作,将所有的限制合并(此时模数和同余数都会不断乘 \(2\)),然后找出一个满足所有限制的最小代表元 \(t\),同时不断累加最小的 \(S\) 和 \(m\)。别忘了检查限制是否冲突(交叉验证,类似于 cdq 分治)。

  2. 然后我们还需要考虑 \(n=0\) 的情形,令 \(d = a_0 \oplus t\),现在我们考虑如何将 \(d\) 放入同余类中,分类讨论:

  3. 若存在 \(2^i < \operatorname{lowbit}(d)\),此时 \(d\) 一定满足同余类约束,直接替换出以前的一个,\(m\) 不变,只需要将 \(S \leftarrow S+d\)。

  4. 若不满足,则 \(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\)。(这个真的只能感性理解,简直不是人类)

  5. 于是我们做完了此题,代码细节不少。但是这个在模拟赛中只能获得 22 pts,因为它只能处理单次询问,我们可以使用 trie 优化,但我懒得写了。

总结:

  1. 观察:式子转化思想、邻项技巧 / 按位考虑、刻画答案或限制、从特殊入手 / 分类讨论思想、构造思想、极值思想(大杂烩)

  2. 三个二进制知识点

第三场

  • A

错因分析:没有想到错排。

正解:

  1. 首先确定 \(A\) 的方案数,即为 \(A^N_M\)。

  2. 然后考虑确定 \(B\) 的方案数,由题目中的第一条限制不难想到错排计数,但是这和普通错排有所区别。考虑普通错排的递推:\(D(0)=1,D(1)=0,D(n)=(n-1)\times(D(n-1)+D(n-2))\)(证明:第一步将 \(n\) 放置,有 \(n-1\) 种方法;第二步设 \(n\) 放置的位置为 \(k\),若 \(k\) 放在 \(n\) 位置,有 \(D(n-2)\) 种方法;若不放,则有 \(D(n-1)\) 种)。

  3. 这里只是选数的范围扩大了,所以当我们放 \(n\) 时,可以放 \([N,M]\) 中的数,方案数即为 \((M-N) \times D(n-1)\),根据加法原理相加即可。注意初始 \(D(1)=M-N\)。

总结:

  1. 题型:错排公式的应用。
  • B

错因分析:没有进行图论建模。

正解:

  1. 看到网格图应当图论建模,考虑将公共边看作点,不难发现每个类型的网格对应一种约束关系。将有管道看作边权 \(1\),没管道看作边权为 \(0\),对着这些网格可以建边。

  2. 我们可以虚拟一个点 \(0\) 来和那些像 \(0\) 号网格那样的点,这样整个图就是一个连通图。实现时我们并不需要真正的建出图,可以使用带权并查集维护每个点到 \(0\) 的边权异或和,若为 \(1\) 则建边(因为要两两配对)。

总结:

  1. 题型:带权并查集维护 2-SAT 问题(维护异或和)。

  2. 思想方法:图论建模——虚拟节点、网格图建模(将公共边看作点,约束关系看作边)。

  • C

错因分析:没有简化问题,从而设计出 dp。

正解(以下令 \(\lvert S \rvert=N,\lvert T \rvert=M\)):

  1. 虽然是个人都能看出这是 dp,但是直接做是没法做的,所以考虑简化问题。具体而言,我们不妨钦定 \(X \le Y\),因为要操作 \((M-N)/2\) 次,所以答案即为 \((M-N)/2 \times X + dp_{M+1} \times (Y-X)\)(\(M+1\) 是因为要考虑所有插入段)。

  2. 然后我们可以定义状态。不难发现插入操作并不影响字符相对顺序,因此我们可以定义 \(dp_{i,j}\) 表示处理 \(T\) 的前 \(i\) 个字符,映射到 \(S\) 上是第 \(j\) 个字符所需的最少 BA 操作的次数。

  3. 现在我们只需要考虑 BA 操作了,接着考虑转移,发掘一些性质。考虑类似括号序列的 trick,我们可以设 B 为 \(1\),A 为 \(-1\)。研究这种序列状物可以考虑前缀和,我们需要一种能够精确刻画 BA 操作次数的东西。可以想到使用最大前缀和进行刻画,不难发现 AB 操作并不影响最大前缀和,而 BA 操作可以使其加一。对于一个插入段,其 BA 操作的最少次数,恰好等于 最大前缀和 减 起点的初始前缀和。这个显然是下界(因为每次最大前缀和至多加一),并且这个下界不难构造出来。

  4. 此时我们便可以枚举前驱状态 \(dp_{p,q}\),当其满足 \(S_{q}=T_{i}\),且 \(preS_q=preT_i\)(\(preS,preT\) 分别是 \(S,T\) 的前缀和),就可以转移,转移方程为前驱最小值 加 最大前缀和 减 起点的初始前缀和。

  5. 至此我们得到了一个三次方做法,无法接受。由于最大前缀和的单调性,当 \(q\) 移动时其单调不增。于是考虑把它单独拎出来,存入单调栈维护,栈中维护三个信息:最大前缀和、前驱最小值减起点前缀和、前两者之和(也即转移量),然后每次从栈顶转移即可。最后注意一下无解的判定。

题型:

  1. 题型:单调栈优化 dp(利用 \(\max\) 单调性)。

  2. 思想方法:简化问题(钦定顺序)、括号序列 trick、刻画前缀和(最大前缀和)。

第四场

  • B

错因分析:想到了无解的情形,但是没有继续对最大值的下界进行分析。

正解:

  1. 首先尝试观察此题的结构,展开 \(s_1,s_2,\dots\) 之后,对相邻两式相减,不难得到 \(s_{i+1}-s_i=a_{i+m}-a_i\),这很明显是一种差分约束关系,可以感受到 \(a_i,a_{i+m},a_{i+2m},\dots\) 这些位置形成了链状结构,任何 \(a_i\) 都可以由 \(a_{1 \sim m}\) 中的元素通过增加偏移量的方式来表示。

  2. 对于无解的情况,显然 \(r-l+1<m\) 时无解(因为它不能形成一条完整的链,也就没有约束)。

  3. 回到所求,我们尝试刻画最大值 \(M\) 的下界。显然 \(M\) 满足 \(\forall i \in [1,m],a_i+mx_i \le M\),其中 \(mx_i\) 表示一条链上偏移量的最大值。

  4. 可以将这 \(r-l+1\) 个条件合并,得到 \(\sum(a_i+mx_i) = \sum a_i + \sum mx_i = s_1 + \sum mx_i \le m \times M\),也即 \(M = \lceil \frac{s_1 + \sum mx_i}{m} \rceil\)。

  5. 然后处理询问,主要是求 \(\sum mx_i\)。常见套路是将询问离线,然后利用最大值的单调性,树状数组+单调栈进行扫描线。具体而言,我们可以维护一个偏移量单调递减的单调栈,然后把询问挂在右端点上,这样每次只需要单点查左端点(因为是左端点的偏移量是最大的),然后差分进行区间修改(就是修改那些单调栈中被弹出的区间,全部将最大偏移量修改为当前区间的最大偏移量即可)。

总结:

  1. 思想方法:观察结构、刻画条件、合并约束

  2. 代码:利用最值单调性,树状数组+单调栈进行扫描线的相关实现技巧。

第五场

赛时过了 A。

  • B

错因分析:没有通过极差想到单调队列。

正解:

  1. 看到求极差,考虑单调队列维护。首先将 \(c_i\) 从小到大排序,对于一个滑动窗口,目前只需要解决它是否能够满足关卡的约束。

  2. 我们不妨设置一个标记来确定某个关卡是否已经满足约束。那么我们现在就需要一个线段树来维护这个标记,具体而言,它需要支持:将所有 \(h_i \le v\) 的关卡打标记(即区间赋值),查询 \(\max h_i\) 的位置是否打上标记(即整个窗口已满足约束),还有删除最早的操作。

  3. 如果没有第三个操作,我们完全可以使用正常的懒标记线段树维护之。但是加上了第三个操作,这就很像单调队列的结构了,于是我们可以使用一种“标记永久化”的技巧(其实就是标记固定不下传),这样删除的时候直接删即可;同时对每个线段树上的区间维护单调队列,修改时只要区间最大的 \(h_i\) 比队头元素小就可以打标记了。

总结:

  1. 题型:单调队列维护极差、标记永久化+单调队列维护可删除线段树。

第六场

  • A

竟然败在了黄题上,more and more vegetable, what should i do???

错因分析:没有从奇偶位置考虑。

正解:

  1. 不难发现我们总是可以逐位操作来使 \(s=t\),只有最后一位无法操作。

  2. 进一步,我们发现我们总是对奇偶位置共同操作,因此奇数位 \(t_i-s_i\) 之和与偶数位之和的差不变。

  3. 由于我们最后希望奇数位和偶数位之和均为 \(0\),因此只要初始的差为 \(0\) 即可满足约束。这个显然满足必要性,充分性的话反正差不变随你怎么调,所以也是易证的。

总结:

  1. 思想方法:看到相邻操作——想到奇偶位置、抓住不变量。
  • B

错因分析:没有刻画哪些人能取到球。

正解:

  1. 因为要求拿到球的人的权值最小值,所以思考哪些人能取到球,即 \(k \times s_i+s_j\)(其中 \(s_i\) 表示 \(a_i\) 的前缀和,\(j \le i\),可以理解为 \(k\) 轮之后再加一个余数)

  2. 由裴蜀定理,可知存在 \(k \times s_i \bmod n = \gcd(s_i,n)\)(证明其实就是设 \(\gcd(s_i,n)=d\),然后拆分一下 \(s_i,n\) 再用定理即可),代入原式。然后因为 \(n\) 的因子个数不多,所以可以枚举 \(\gcd(s_i,n) = d\),每个模 \(d\) 余 \(s_j\) 的都产生贡献。可以预处理 \(mn_{i,j}\) 表示模 \(i\) 余 \(j\) 的位置的最小值,然后 \(mn_{i,s_i \bmod j}\) 对 \(ans_j\) 贡献,答案即为 \(ans_{\gcd(s_i,n)}\)。

总结:

  1. 思想方法:刻画答案、看到移动步长想 \(\gcd\)、按余数分类贡献。

  2. 代码实现:预处理:抽象预处理(将具体数值抽象为下标)+代入查表、前缀询问:边查边回答。

第七场

  • B

错因分析:没有分类计数。

正解:

  1. 观察到对于满足 \(c_i \oplus c_j = x\) 的边 \((i,j)\),端点要么都选,要么都不选,于是可以缩成一个点处理。

  2. 其他不产生这种边的 \(x\),贡献均为 \(2^n\)。

  3. 总共仅有 \(m\) 个 \(x\),相同的一并处理累加贡献即可。

总结:

  1. 思想方法:分类计数 / 缩点技巧(看到点集想并查集)。
  • C

错因分析:没有刻画合法条件。

正解:

  1. 首先刻画一个起点合法的条件,考虑一个点集,你首先得从根走到这个点集,然后走完它。但是中间可能会经过一些不属于点集的点,所以令 \(T\) 为包含点集 \(S\) 的最小连通子树,\(dis\) 表示 \(rt\) 到 \(T\) 的距离,则需要满足 \(dis+siz_T \le k\)。

  2. 因为这个 \(dis\) 实际上并不好处理,所以我们需要一些简化。考虑让 \(a_i\) 最小的点成为 \(rt\)。

  3. 考虑扩展,研究一条父子边。对于节点 \(u\),令它的一个儿子为 \(v\),\(v\) 子树中最小的 \(a\) 若 \(\le k\),则这条边会包含在 \(T\) 中;否则,我们需要往下走,即 \(dis+1\)。于是维护 \(dis+siz_T-k\),每次将 \(k<min_a\) 的位置 \(+1\),回溯时 \(-1\),当最大值不超过 \(0\) 说明合法,用线段树可以方便地处理。

  4. 事实上到这里已经可以通过此题,但我们注意到两个性质:一、无论是扩展的过程,还是操作的区间都是前缀形式;二、修改操作本质是前缀截断(因为这次加一,回溯时就会减掉)。这提示我们可能存在线性做法。

  5. 具体而言,我们仅需使用一个变量不断累加每次扩展的点数,同时维护前缀最小值的位置数(其实维护最大值也可以,我代码里只是不等号变了个方向),在 dfs 中只需要用另一个变量记录前缀最小值即可。

总结:

  1. 思想方法:量化条件并维护它 / 化简难的部分 / 从局部到整体的思想
posted @ 2026-09-08 02:08  _KidA  阅读(36)  评论(0)    收藏  举报