QOJ 4th cup 补题计划 Stage 1~3
__biu_biu_biu__
·
2026-08-12 20:59:05
·
算法·理论
本补题计划面向的是 4th-cup 中所有赛事通过人数 [100,300) 的题目,所有题目都在 NOIP 范围内,难度大约橙到蓝。
Stage 1: Grand Prix of Korolyov (CDEFK)
QOJ14428 Staple Stable (C)
我们枚举切除的矩形的最长的一条边 x ,则另一条边为 y=\lfloor \frac{s}{x}\rfloor ,则此时矩形的答案为 \min(\lfloor\frac{h-1}{x}\rfloor+\lfloor\frac{w-1}{y}\rfloor,\lfloor\frac{w-1}{x}\rfloor+\lfloor\frac{h-1}{y}\rfloor) ,枚举 x 的复杂度是 O(s) ,但由于 x>y 是无意义的,通过交换 x,y 可以变成之前讨论过的情况,故讨论 x<y 即可,时间复杂度 O(\sqrt s) 。
QOJ14429 Sequence Is Not Subsequence (D)
发现 s_n 一定会出现,考虑 s_n 最后一次出现在 t_i ,则 t_{1\sim i-1} 不会存在 s_{1\sim n-1} ,则根据贪心,t_{1\sim i-1} 一定存在 s_{1\sim n-1} 的所有子序列,不然你构造 s_n 无用。
由于要构造 s_{1\sim n-1} 出现,因此如果 s_n\not= s_{n-1} ,则 s_n 需要在 t_i 后额外出现一次。
很容易想到构造出 s_2s_1s_3s_2s_4s_3\dots s_ns_{n-1} 的方案,再将相同字符排除即可。
QOJ14430 Coffee Shops (E)
考虑贪心,将 a 序列中偶数项填最大的 \frac{n}{2} 个数,这样的话你 b 序列接下来无论填什么都是最大的,接下来考虑将 a 序列中奇数项的位置产生贡献,即 a 中奇数项 1,3,\dots 就填比 i 和 i+1 小的数即可,可以倒着从 n\to 1 ,每次从大往小填 b_i 然后填 a_i 。
注意 n 为偶数的情况你的 a_1 没有填最大的数,导致围成环后 b_1,b_n 都无法获得贡献,考虑将 a_1 补上即可。
QOJ14431 Yet Another MST Problem (F)
遇到 mex 考虑枚举边权 x 然后将所有不包含 x 的区间合并。每次合并的左右区间形如 [1,x'),(x',n] ,容易发现此时的区间是递增的,所以只用双指针维护一下当前扫到了 [1,pl),(pr,n] 然后暴力维护一下即可,时间复杂度是 O(n\alpha (n)) 的。
QOJ14436 Robot Construction (K)
我们发现最终答案的取值一定是一个连续的区间 [0,x] ,我们考虑分析一下在高度区间为 [0,h] 时遇到障碍高度为 a_i 时的影响:
考虑扫描右端点 r ,然后维护 l\in [1,n] 的值域 [0,V] ,则加入点 a_r 对 V\in [0,a_i) 无影响,V\in [a_i,2a_i) 是赋值为 a_i-1 ,V\in [2a_i,+\infty) 是减去某个数。
注意到 V 随着 l 的增大而增大,故 [0,a_i),[a_i,2a_i),[2a_i,+\infty) 都是连续的区间,考虑线段树上二分维护,时间复杂度 O((n+q)\log n) 。
Stage 2: Grand Prix of Paris (ABFHK)
QOJ14130 Apple Tree (A)
假设离节点 i 距离为 k 的点有 d_i 个,则答案为 \sum \binom{d_i}{k} ,则现在需要求出 d_i 。
显然可以直接点分治做,给出一种不同于点分治依赖 k 的大小的做法。
我们注意到每个节点的直接子节点数量都严格少于 其父亲节点的直接子节点数量,说明树的高其实是非常小,约为 O(\sqrt n) 的,所以只有 k\le 2\sqrt n 时才有答案。
考虑树形 DP,f_{u,d} 表示 u 子树内距离为 d 的节点个数,g_{u,d} 表示不在 u 子树内距离为 d 的节点个数。
则有 f_{u,d}=\sum\limits_{v\in son_u} dp_{v,d-1} ,g_{u,d}=g_{fa_u,d-1}+f_{fa_u,d-1}-f_{u,d-2} ,时间复杂度 O(nk) ,要剪枝并使用 vector 来存 DP 数组。
QOJ14131 Balatro (B)
由于 k 和 \min(a_i,b_i) 很小,考虑从这两个方面入手。
考虑将牌堆分成两堆,分别表示 a_i<b_i 的牌堆 1 和 b_i<a_i 的牌堆 2 ,则答案即为从 1 中选 x 张再从 2 中选 k-x 张牌的最大值。
考虑 f_{i,j} 表示从 1 中选择 i 张牌的 a_i 之和为 j 时 b_i 之和的最大值,故有转移 f_{i,j}=\max(f_{i,j},f_{i-1,j-a_i}+b_i) ,2 牌堆同理构造 DP 数组 g ,最后的答案即为 \max (y_1+g_{x,y_2})(y_2+f_{k-x,y_1}) ,时间复杂度为 O(V^2k^3) ,其中 V 是指 \min(a_i,b_i) 的值域,为 100 。
QOJ14135 Framboise 2(F)
首先每个植物连向自己所相邻的边界是一定可以的,方案数为 2^k 。
由于 r=1 的植物向下连和 r=2 的植物的情况是一样的,这里只讨论 r=1 的情况。
一棵植物向下连的充分条件是下方没有植物,假设有 m 棵下方没有植物的植物,则方案数为 2^m 。
考虑向左连和向右连的情况,则显然只有最左端和最右端才能连出去(假设最左端为 l' ,最右端为 r' ):
只有最左端连出去:则 r=2 且 c < l' 的植物是一定无法向上连的,假设这样的植物共有 x 棵,则方案数为 2^{m-x} ;
只有最右端连出去:同理,假设 r=2 且 c> r' 的植物有 y 棵,则方案数为 2^{m-y} ;
两端都连出去,方案数为 2^{m-x-y} 棵。
故方案数为 2^k(2^m+2^{m-x}+2^{m-y}+2^{m-x-y} ,交换 r=1,2 后再处理一遍即可。
QOJ14137 Heure de Rush (H)
考虑现将每个位置减 k ,变成将所有元素变成 0 。
考虑第 i 位 <0 ,则一定找 a_j>0 的最小的 j 来补上这一块,这个可以双指针实现,则答案即为 \max \lceil \frac{j-i}{d}\rceil 。
QOJ14140 k Operations (K)
贪心一下很容易发现相当于是每次减最小的数一直到 1 ,然后再减第二小的数,以此类推,直到减了 k 次或者无元素可减。
考虑对于每一次操作 [l,r,k] ,二分 x 使得区间 1\sim x 小的数全部减到 1 ,第 x+1 的数还没减到 1 ,则相当于 \sum\limits_{1\le i\le x} (a_{\text{kth}(l,r,i)}-1)\le k\le \sum\limits_{1\le i\le x+1} (a_{\text{kth}(l,r,i)}-1) ,很显然,答案为 \prod\limits_{x+2\le i\le r-l+1}a_{\text{kth}(l,r,i)}\times (a_{\text{kth}(l,r,x+1)}-(k-\sum\limits_{1\le i\le x} (a_{\text{kth}(l,r,i)}-1)) ,则用权值主席树维护一下值域和和值域积,可以做到 O(q\log^2 n) ,使用线段树上二分可以做到 O(q\log n) 。
Stage 3: Polar Grand Prix (DGI)
QOJ14417 Roman Numerals (C)
挺好的一个笛卡尔树题。
根据性质 \max(v_l,v_{l+1},\dots,v_r)=v_{lca(u,v)} ,这个 f(l,k-1) 和 f(k+1,r) 就很像递归笛卡尔树,由于贡献是 a_k-f(l,k-1)+f(k+1,r) ,也就是你每次往左子树走一次你的贡献会乘 -1 。
因此贡献就是 \sum\limits_{l\le i\le r} a_i(-1)^{f(i)} ,其中 f(i) 表示 lca(l,r) 走到 i 要往左走的次数。
这个东西显然是可以优化的,你考虑与处理一下 b_i= a_i(-1)^{f'(i)} ,其中 f'(i) 表示笛卡尔树根到 i 要往左走的次数。
然后答案就是 (-1)^{f'(lca(l,r))}\sum\limits_{l\le i\le r} b_i ,前缀和搞一下就做完了,复杂度可以做到 O(n+q) 。
QOJ14418 Disjoint Set Splitting (D)
这期神了。
注意到答案具有单调性,想到二分但由于强制在线无法进行。
但是这个题的答案只有 0 和 1 ,故你的强制在线的系数是可以提前算出来的!然后就可以离线了,强强。
QOJ14421 Far Away (G)
对于一个询问 (u,v) ,我们发现如果答案为 Yes 且两个点在一个联通块,则相当于两点的最短路径为 d>20000 ,也就是说至少有 \frac{1}{5} 的点都在路径上,故考虑随机化枚举一个点 x ,然后跑最短路,判断 d_u+d_v ,单次正确的概率为 (1-0.8^x)^q ,跑大概 O(1) 次就可过了,时间复杂度是 O(n\times t),t\in [75,300] 。
QOJ14423 Two Permutations (I)
考虑从大到小维护这个序列,由于支持 O(n^2) 构造,显然每一个元素移动 O(n) 次是可以的。
则假设维护到 x ,x 在 A 中是 pa_x ,B 中是 pb_x ,则由于 x\sim n 都被固定了,所以 x 是不能向后换的,故 pa_x<pb_x ,则是无解的。
然后考虑构造 pb_x\le pa_x 的情况,故考虑每次操作的代价最小,即按照一个尽可能长的序列进行交换,容易发现构造 (y_1,y_2),(y_2,y_3),\dots,(y_i,y_{i+1}) 可以做到循环移位的效果,这样代价是 O(1) 的,不然肯定会导致这个上升子序列破坏掉,肯定不优。