2026年5月12日讲题题单

A - 百万富翁

大概就是每次可以询问一对 \((i,j)\) 位置,要求出序列中的最大值是谁。

首先一个直观的想法就是每次两两分组打擂台,然后递归所有胜者,但是我们发现这样不能够通过,因为这个题目要求询问轮数只能是 \(8\),而我们的这个做法需要询问 log 轮。同时我们可以注意到,我们可以询问的次数是大于 n 的,所以自然可以猜想,我们可以调整最后的几次操作,看看能不能满足要求。

具体的,我们可以设 \(f_{i,j}\) 表示 \(i\) 个人,经过 \(j\) 次轮操作之后只剩下 一个人的代价最小是多少,转移就是 \(f_{i,j} = f_{p, j - 1} + cost(i, p)\),其中 \(cost(i,p)\) 指的是把 \(i\) 个人经过一轮操作剩下\(p\) 个人的最小代价,显然,因为代价类似于二次函数,所以每一组分成的人数大概一样的时候代价最小,换句话说,我们将所有人划分成 \(p\) 组,每一组之间两两比较,最后每两组之间最多相差一。这个可能还是跑不出来,但是其实这就是个打表题,而且我们可以猜测,前面几次都是两两分组。

B - 元旦激光炮

联合多分!

这是一道交互题。
给你三个排好序的数组,让你在有限次数询问中找到第 \(k\) 小值。

经典做法:先把 \(a,b,c\) 都 resize 到 \(k\) 我们设置 \(l = \lfloor \frac{n}{3} \rfloor\),接下来询问 \(a[l],b[l],c[l]\) 这三个位置,我们找到这三个值中的最小值,并删除这个最小值所在的数组的前 \(l\) 个元素,容易证明这 \(l\) 个元素不可能是可行的第 \(k\) 小值,所以直接递归到 \(k-l\) 的子问题就行,\(k < 3\) 的时候特殊处理一下。

特别的,对于只有两个数组的时候,我们有更加优秀的做法,联合二分,我们可以每次把两个数组都删去一半,让迭代更快。
image

C - 生产计划 (Day 2)

好题,首先我们定义 \(L, R\)

  • 如果 \(\forall a_i=l_i\),求出的答案为 \(L\)
  • 如果 \(\forall a_i=r_i\),求出的答案为 \(R\)

先所有位置都取 \(l_i\) 我们考虑给某一个位置增加 \(1\),最大独立集要么增加 \(1\) ,要么不变,袋券独立集的答案 \(ans \in [L, R]\)。我们仔细思考每个位置从 \(l_i \to r_i\) 的过程,发现一定是一开始它不在独立集里面,然后随着它增大,它进入了独立集,此后每次 \(+1\) 答案都 \(+1\),我们可以用动态 \(dp\),维护这个东西,但是太麻烦,我们其实可以使用换根 dp,按照 dfs 序遍历即可。

D - 末日魔法少女计划

确实好题。
首先 \(k = 2\) 的时候是猫树 \(k = logn\) 的时候是线段树。

这题的思路其实还是 dp 构造,我们沿用猫树的构造,每次确定中间的链接点,然后仍然是把剩余区间平均分,但是这里需要注意,两端的点不需要向单边连边,所以可以设置的稍微长一点。

具体 dp 不是很重要,就不写了。

E - 众数

倒着进行二进制分块。

F - 编程测试

首先我们看到这个题目可以建网络流,但是我们肯定不能暴力去跑,注意到这个网络流类似二分图匹配,于是我们考虑霍尔定理,然后二分答案 \(x\) 再用霍尔定理 check,容易发现,只 check 每个区间即可,不需要 check 每一个子集。

然后观察到 \(l=1\) 的特殊性质,我们可以直接用 李超线段树+二分 处理出所有前缀答案。但是 \(l\) 不是 1 怎么办呢,我认为这种问题要么扫描线,要么分治,我们考虑后者,这样我们每次处理跨过当前 mid 的区间,都在左右端点都在左边的,我们只需要用 李超线段树判断是否有交点就行(这个地方好像题解继续用二分,导致复杂度变成 \(O(nlog^3n)\))。然后跨段的,我们发现左右端点的决策是独立的,所以我们分开用两个可持久化李超线段树,然后二分答案,找到两侧的最值 check 即可。

G - 穿越

没有见过这样的题目,好题。

我竟然没有想出来单组 \(A,B\) 怎么做。

对于单组 \(A,B\),我们可以用 segment tree beats,我们就只有几个操作

  • \([Y1[i], Y2[i]]\) 区间加。
  • 查询全局 min
  • 全局 (min _+ B) 对全局进行 check min

但是,我们没办法快速回答多组询问,于是我们考虑答案在什么时候取道,经过思考发现,这个答案一定在 横轴为 A 的个数,纵轴为 B 的个数的一个凸包上,于是我们考虑线段树莓哥节点是一个凸包,然后我们在凸包意义下做这个操作就好。

但是注意一下,这个复杂度不是 \(O(n^2 \log n)\) 的,因为 \(A,B\) 个数的值域都是 \([1,n]\) 所以有一个结论,凸包的节点只有 \(n^{\frac{2}{3}}\) 个。

于是复杂度为 \(O(n^{\frac{5}{3}}\log n)\)

J - Souvenirs

支配对经典题目,其实 \((a_i - a_j)_{min}\)\((a_i + a_j)_{min}\) 都是可以求出来的,不同的是,前者的支配对个数为 \(O(n \log n)\) 但是后者的支配对个数为 \(O(n)\)

K - rpmtdq

我们知道序列上 \(a_i + a_j\) 的支配对个数是 \(O(n)\) 的,但是现在在树上,我们考虑树上的序列哪里来,容易想到是点分治,这样我们每次把当前连通块内的点到分治中心到距离当作 \(a_i\),对这个序列统计支配对就好,最后回答询问的时候全部离线,然后扫描线即可。

注:在分治中心 \(rt\) 同一个子树内的点对的距离不是 \(a_i + a_j\) ,但是他的答案我们算大了所以不会影响最终的答案。

L - TEST_199

求出支配对之后,上 K-D Tree。

M - 骰子 / Kostki

推式子题目,设 \(f_i\) 表示刚好跳到 \(i\)\(g_i\) 表示跳过了 \(i\),落在 \([i+1,i+k-1]\) 的概率。推式子不想讲。

posted @ 2026-05-23 15:03  suuugg  阅读(22)  评论(0)    收藏  举报