2026 集训队作业选做

Contest Link

2. [QOJ837] Giant Penguin

复杂的树上问题可以考虑点分树。

我们每次取出重心,考虑所有跨过至少两棵子树的路径。

如果路径不经过重心,那么肯定经过跨过重心的返祖边,我们提出所有这样的返祖边的任意一个端点,题目的性质保证了此类点只有 \(O(k)\) 个,对这些点都 bfs 一遍就能类似树求答案了。\(O(nk\log n)\)


3. [QOJ850] Edit Distance Yet Again

朴素 dp \(f_{i, j}=\min(f_{i-1, j}+1, f_{i, j-1}+1, f_{i-1, j-1}+[s_i\neq t_j])\)

每次 \(|i-j|\) 变化 \(1\) 时,\(f_{i, j}\) 的值至少增大 1,于是我们只保留 \(|i-j|\le k\)\(f_{i, j}\)\(O((n+m)k)\)

更进一步地,如果 \(i-j=i'-j' \land i<i' \land f_{i, j}=f_{i', j'}\),那么我们只保留 \((i',j')\) 肯定不劣:考虑刻画 \((i, j)\)\((i', j')\) 到终点的路径,发现 \((i', j')\) 复制 \((i, j)\)\(x>=i' \land y>=j'\) 路径,最终结果一定更小。

于是我们重新设置状态,\(g_{i, d}\) 表示所有满足 \(x-y=d,f_{x, y}=i\)\((x, y)\)\(x\) 最大的值是多少,需要支持 lcp,时间复杂度为 \(O(n+k^2 \log n)\)\(O(n\log n+k^2)\),视实现为 hash 还是 sa。


8. [QOJ888] Travel around China

与 T2 很是类似,从树上问题变成了序列问题,一样考虑分治,每次处理 \((l, mid, r)\) 表示 \(s\in [l, mid],t\in [mid, r]\) 之间的路径和。

先跑三遍 dij,处理出 \(dis_{0/1/2, x}\),分别表示 \((mid, 0),(mid,1),(mid,2)\)\(x\) 的最小距离,则答案就是 \(\sum_x \sum_y \min(dis_{0, x}+dis_{0, y}, dis_{1, x}+dis_{1, y},dis_{2, x}+dis_{2, y})\),离线后二维偏序解决。

现在还有一个问题,在行数为 3 的情况下,\((mid, 0)\)\((x, 0)\) 的最短路可能会途径 \((x, 2)\),穿过边界再折返回来,如果每次 dij 整个网格复杂度就炸了。另设 \(f_x\) 表示 \((x, 0)\)\((x, 2)\) 的最短路,预处理一下即可。

\(O(n \log^2 n)\),代码先咕咕了。


9. [QOJ962] Thanks to MikeMirzayanov

这个反转的操作形式太丑陋了,我们把它改成:将序列划分成若干段并局内反转,再整体反转整个序列。如果操作次数为偶数,我们可以直接忽略“整体反转整个序列”这一步。

考虑分治解决。我们每次分治需要将 \(a_i\le x\)\(a_i>x\) 的数分成两堆:不妨分别把它们看作 \(0\)\(1\),我们只关注 \(0\),\(1\) 所形成的极大连续段:我们每 \(3\) 个连续段为一组,并反转每一组的前两个段。容易发现我们只需要 \(O(\log)\) 次操作即可完成目标。

容易发现分治的每一层是可以并行的。于是总操作次数 \(O(\log^2 n)\),时间复杂度 \(O(n\log^2 n)\)


11. [QOJ970] Best Subsequence

先二分答案,判断 \((w, l, r, k)\) 是否可行。

遇到 \(x+y\le w\) 的问题,可以考虑 \(2\times\min(x, y)\le w\),则相邻两个选择的元素之间必然有一个 \(\le \frac w 2\)

如果有一个 \(\le \frac w 2\) 的元素未被选择,我们将他替换掉其相邻被选择的 \(> \frac w 2\) 的元素,一定不劣。

于是所有的 \(\le \frac w 2\) 都应该被选择,然后对于相邻的被选择的 \((u, v)\),尝试再选择 \((u, v)\) 之间的最小值。

我们动态维护单调栈,发现 \((u, v)\) 之间的最小值只有枚举到 \(v\) 时弹出的元素可能造成贡献,总量为 \(O(n)\) 容易维护。\(O(n\log V + q \log^2 V)\)


12.[QOJ971] Binary Search Tree

一个常见 trick 的运用。BST 本身是不能直接维护的,但我们考虑值域下标互换,相当于每次找到出现时间最小的点,然后往这个点的左右递归建树,类似于笛卡尔树。

接着我们发现一个点的深度就是左右的前/后缀最大值个数,单侧递归线段树维护一下,\(O(n \log^2 n)\)


24.[QOJ1812] Interesting Coloring

对一个图进行染色是非常困难的,考虑取出一棵 dfs 树,对于任意节点 \(u\),我们保证 \((rt, u)\) 上边的颜色种类数 \(\le 7\),再加上任意一条非树边即可完成构造。

我们现在已经枚举到了 \(u\)\((rt, u)\) 的路径都已经填完,则对于 \(v \in son(u)\),我们肯定会选一些 \((u, v)\)\((rt, u)\) 中已经出现过的颜色,另一些填全新的颜色。我们需要找到一种分配的方法。下面提出论断:按 \(siz_v\) 从大到小排序,我们只需要让前面几个儿子与 \(u\) 的连边填 \((rt, u)\) 链上出现过的颜色就可以满足条件。

证明:假设 \((rt, u)\) 上颜色总数为 \(c_u\)\(x\)\(u\) \(siz\)\(\ge k\) 大的元素,则 \(c_x=c_u+1\)\(siz_u \ge k\times siz_x+1\)。若存在 \(u\) 满足 \(c_u \ge 8\),则 \(n=siz_1>\sum_{i=1}^7 i!>5555\),证毕。


25.[QOJ1813] Joy with Permutations

考虑 \(n=4\),我们容易用四次询问区分出 (最小值,次小值) 和 (最大值,次大值),再用两次比较得到答案。

容易发现我们无法用一些中位数询问比较出最值和次值,两次比较询问都是用来给最值和次值的。于是我们考虑增量构造,动态维护目前四个还没有区分的数。

具体地我们动态维护 \((l1, l2, lx)\)\((r1, r2, rx)\),每次新增 \(i\)\(query(l1, r1, i)\),对返回的值进行一下分类讨论,即可。


27.[QOJ1817] AND Permutation

我们按最高位 \(k\) 分治,则此时 \(a_i>2^k\) 所匹配的 \(a_j\),至少满足 \(a_i \&a_j\) 的后 \(k-1\) 位都是 \(0\)。我们再交换 \(a_i\)\(a_i-2^k\) 所匹配的数即可,注意到题目中的性质保证 \(a_i-2^k\) 存在。\(O(n\log V)\)


31.[QOJ2550] Joke

由于 \(s\) 只和所有的有序对 \((p_i, q_i)\) 有关,我们让 \(p_i\)\(1...n\) 排列。

把大小关系看成有向边的话,题意等价于不存在环,等价于不存在长度为 \(4\) 的环:首先环长度一定是偶数,且环上面的结构一定是一条链,这个环如果比较大的话一定可以被分解成一个更小的环。

考虑 \(q_i=n\) 的位置 \(i\)。如果 \(s_i=0\)\(q_i\) 的出度为 \(0\),我们可以将其删去;否则要求任意 \(j>i\)\(j\) 满足 \(s_j=0\),否则 \(j\)\(i\) 就在同一个环上了,此时我们可以丢弃所有的 \(j\)
因此,我们有一个数组 q 和两种操作:

  • 删除最大元素
  • 删除最大元素及其右侧所有元素。

这就是 IS 的结构,因此我们直接进行 dp,计数所有的 IS 即可。复杂度 \(O(n^4)\)


32.[QOJ1840] K-onstruction

直接随机不太能过,添加一个优化,我们先随机 \(29\) 个和为 \(m\) 正整数,令 \(f_i\) 表示这 \(29\) 个数中和为 \(i\) 的方案,那么我们添加一个负数 \(-i\) 就可以得到一种 \(0\) 出现 \(f_i+1\) 次的方案。

\(m=1500\) 可过。


36.[QOJ1875] Nein

我们判断一个数的 \(10^k-1\) 倍里面有没有 \(9\) 是困难的,但是判定一个不包含 \(9\) 的数能不能被 \(10^k-1\) 整除却相对容易。

因此考虑转化,每次我们要判断有多少前缀为 \(s\) 的、不包含 \(9\) 的数能被 \(10^k-1\) 整除:我们把这个大数每 \(k\) 位分块,按照模 \(k\) 的余数从大到小依次转移即可。


42.[QOJ2548] Juggler's Trick

\(K=R+B\)

对于一个已经确定染色的序列 \(S_{1...n}\),我们判定其可以清空当且仅当 \(K|n\land cnt_B=nB/K\land cnt_R=nR/ K\)。证明:必要性显然;倘若当前状态下无法进一步操作,一定有对于所有的 \(l\)\(SR_{l..l+K-1}\neq R\)\(l\) 变化 \(1\) 时,\(SR_{l...l+K-1}\) 至多变化 \(1\),则 \(\max SR_{l...l+K-1}<R\)\(\min SR_{l...l+K-1}>R\),而两者都可以推出 \(cnt_B\neq nB / K\),与条件矛盾。

那么对于一个还未染色的区间 \((l, r]\),只要满足 \(l\bmod k=r\bmod k\land(SB_r-SB_l)\le (r-l)/K\times B\land (SR_r-SR_l)\le (r-l)/K\times R\) 就能被清空。可设线性 dp,转移是一个动态二维偏序,cdq 维护之,复杂度 \(O(n\log^2 n)\)


44.[QOJ2554] AND PLUS OR

我们把每个下标 \(i\) 看作 \(\{0, 1,...N-1\}\) 的一个子集,把 \(a\) 看作对子集 \(i\) 的一个函数 \(a(i)\)

原题意即为我们要找到三个互不相交的子集 \((x,y,z)\),满足 \(a(x\cup y)+a(x\cup z)<a(x)+a(x\cup y\cup z)\),即 \(a(x\cup y)-a(x)<a(x\cup y\cup z)-a(x\cup z)\)

枚举 \((x, y)\),记 \(f(z)=a(x\cup y\cup z)-a(x\cup z)\),我们需要判断是否存在 \(z\) 满足 \(f(z)>f(\emptyset)\)

若存在 \(z\) 满足条件,则必然有 \(\emptyset\in a \in b \in z,|b|-|a|=1\) 满足 \(f(a)<f(b)\)\((x\cup a,y,b\setminus a)\) 也是一组解。

那么原问题如果存在解,一定存在 \(|z|=1\) 的解,同理也一定存在 \(|y|=1 \land |z|=1\) 的解。

于是我们暴力枚举所有的 \(x, y,z,|y|=|z|=1\) 即可。复杂度 \(O(2^n\times n^2)\)


57.[QOJ4795] Taxi

如果已经确定了司机和乘客所在的位置,一个最大的匹配代价为 \(\sum_{u\neq rt} (\min(siza_u, m-sizb_u)+\min(sizb_u, m-siza_u))\times w(u, fa_u)\),证明可以考虑重心相关性质。

\(\min(a, b)\) 拆成 \(\sum_{i\ge 1} [a\ge i] \land [b\ge i]\),对于每个点 \(u\) 我们要计算 \(siza_u\ge i \land sizb_u\le m-i\) 的方案数,组合数算一下即可,复杂度 \(O(n^2)\)

60.[QOJ4808] Great Party

结论:当 \(n\) 为奇数时先手必胜;否则所有石子堆数量 \(-1\) 异或和不为 \(0\) 时先手获胜。

考虑归纳证明。

  • \(n=1\) 时,先手必胜。
  • \(n\)\(>1\) 的奇数时,先手可以操作最大的一堆石子堆,将其变空且剩下的石子堆 \(-1\) 异或和为 \(0\)
  • \(n\) 为偶数时,双方选手谁先改变石子堆数量谁就输了。于是一堆石子取到只剩一个时就无法操作,相当于在每堆石子数量 \(-1\) 的情况下玩 Nim 游戏。

\(s_i=\bigoplus\limits_{j=1}^i (a_j-1)\),则区间 \((l, r]\) 后手获胜当且仅当 \(l\equiv r \pmod 2\)\(s_l=s_r\)。用莫队维护一下,时间复杂度 \(O(n\sqrt n)\)


83.[QOJ8086] Cloyster

考虑分治,我们每次把一个矩形分成两个小矩形并判断最大值在哪个矩形里。考虑中间的那一行,我们找到这一行的最大值 \(M\),并且询问最大值周围 \(8\) 个元素的值,并分为两种情况:

  1. \(M\) 为四周最大的数,那么 \(M\) 即为最大值。
  2. 否则我们断定,全局最大值肯定在 \(M\) 相邻的最大值的那一个矩形里面。

考虑证明,我们模拟整个网格的构造过程,从最大点开始,从大到小枚举值,每次在连通块的边上多扩展一个点,那么第一次扩展到 \(M\) 所在行一定是在 \(M\) 点,如果最大值在 \(M\) 左边,在这之前 \(M\) 右边的点就都不会被扩展到,那么与 \(M\) 相邻的最大值肯定也在左边。

这样这道题就做完了,询问次数在 \(3n+12\log n\) 次左右。

115.[QOJ]12213 Cool pairs

我们将 \(b\) 按大小顺序分别染色为 \(-n\dots 1\),对于每一个 \(a_i\),如果 \(a_i=0\) 对答案的贡献就是 \(n-i\),如果 \(a_i=n\) 对答案的贡献就是 \(0\),且容易证明 \(a_i\) 对答案的贡献可以取到 \(0\dots n-i\) 中的任意一个数。

那么我们按照 \(a\) 的大小关系,枚举 \(i\) 选取 \(a_{p_1}\dots a_{p_{i-1}}\)\(0\)\(a_{p_{i+1}}\dots a_{p_n}\)\(n\),并让 \(a_{p_i}\)\([0, n]\) 中的某个数,由调整法可知存在一个 \(i\) 能满足\(\texttt{总对数}=k\) 的条件。

posted @ 2025-12-28 12:36  Nangu  阅读(106)  评论(0)    收藏  举报