杂题选做 7

题单

Acorn Quarrels

待补。

Bowser's Castle (Hard Version)

这也太变态了。

考虑你需要让返回值对应到结构上,那么询问 \(x_i=i\) 就是一件很自然的事情。那么这个询问会带给我们什么呢?

思考一下,如果将表达式建成一棵树并且保证相邻两层的运算不相等,那么该询问相当于你初始在根,遇到 \(\max\) 走最右侧的儿子,遇到 \(\min\) 走最左侧的儿子后抵达的节点,设其为 \(p\)。此时:

  • \(p=1\),则根处的运算为 \(\min\),且节点 \(1\) 没有儿子;

  • \(p=n\),则根处的运算为 \(\max\),且节点 \(n\) 没有儿子;

  • 此时 \(1 < p < n\)。考虑 \(p\) 到根的路径,这条路径将原树切成了左右两半:挂在路径左侧的部分与挂在路径右侧的部分。

那么想到分治处理。假设我们当前在处理 \([l,r]\),先询问一次对于 \(l \le i \le r\)\(x_i=i\) 的序列,得到一个 \(p\)。由于我们不知道 \(p\) 父亲的运算,因此我们需要递归 \([l,p]\)\([p,r]\)。同时我们希望另一侧不影响其余询问结果,因此递归左侧时需要将 \(x_{p+1} \sim x_r\) 设为 \(-\infty\);递归左侧时需要将 \(x_l \sim x_{p-1}\) 设为 \(+\infty\)

注意我们对 \([l,r]\) 还原出来的并不是原表达式中的树形结构,而是仅保留 \(x_l \sim x_r\) 时的表达式结构。

现在我们得到了 \([l,p]\) 的表达式(最外层一定是 \(\max\))与 \([p,r]\) 的表达式(最外层一定是 \(\min\)),我们希望合并这两个表达式。具体地,我们假设左侧的表达式是 \(\max(A_1,A_2,\dots,A_{k_1})(A_{k_1}=p)\),右侧的表达式是 \(\min(B_1,B_2,\dots,B_{k_2})(B_1=p)\),我们希望将序列 \(A,B\) 归并得到一个完成的 \([l,r]\) 的表达式。由于 \(A,B\) 内部已经按照到 \(p\) 的距离排序,我们只需要对于 \(A,B\) 中的某两个元素查询哪个距离 \(p\) 更小即可。那么我们如何询问呢?

假设我们当前得到的表达式为 \(\text{now}\),有两个可能的结构分别为 \(\max(\min(\text{now},R,\dots),L,\dots)\)\(\min(\max(\text{now},L,\dots),R,\dots)\)。为了使询问答案仅受 \(L,R\) 内部的 \(x\) 影响,我们将左部未处理的节点赋值为 \(-\infty\),右部未处理的节点赋值为 \(+\infty\)。此时不难想到只需要让 \(\text{now}\) 内部节点取 \(0\)\(L\) 内部节点取 \(1\)\(R\) 内部节点取 \(-1\) 即可区分这两种情况。

于是我们就得出了答案。分析一下询问次数,每两次递归下去的询问就一定会确定一个叶子,这部分贡献 \(2n\);每合并一次就减少一个子树,这部分贡献 \(n-1\),因此总询问次数不超过 \(3n-1\)

这题有一定的实现细节。具体的,你需要对每个节点维护其表示的区间,其运算符以及一个 vector 表示其儿子的编号。合并若干子树时注意不要出现 \(\max(\max(\dots))\)\(\min(\min(\dots))\) 的情况。

[JOIST 2023] 警卫 / Security Guard

非常厉害的题。

先思考 \(S_i \in \{0,1\}\) 应该如何解决。注意到 \(S_i=0\) 的构成的连通块可以随便走,而想要经过一个 \(S_i=1\) 的点仅需在每个 \(S_i=0\) 的连通块中放入一个保安即可。

扩展到 \(S_i\) 任意的情况,先给每条边放上 \(\min(S_u,S_v)\) 个保安保证方案合法,然后考虑如果我们想要让所有 \(S_i \le k\) 的点构成的若干连通块可达的 \(S_i\) 值增加 \(1\),也仅需在每个连通块中放入一个保安即可。同时必须要在每个连通块中放入一个保安才能令其可达 \(S_i=k+1\) 的点,因为这些连通块在加入 \(S_i=k+1\) 的点后若连通性发生了变化,则必定需要经过 \(S_i=k+1\) 的点可达,因此这些连通块中的保安无法交换。

经过上述推导,记 \(l=\min S_i,r=\max S_i\)\(f(i)\) 为仅保留 \(S_u \le i\) 的点 \(u\) 构成的连通块个数,答案即为 \(\sum\limits_{(u,v) \in E} \min(S_u,S_v) + \sum\limits_{i=l+1}^r f(i)\)

看到连通块个数不好处理,可以考虑使用点边容斥拆掉。一个点 \(u\) 被计算的次数是 \(r-S_u\),边 \((u,v)\) 被计算的次数是 \(r-\max(S_u,S_v)\),则答案可以被改写为 \(\sum\limits_{(u,v) \in E} \min(S_u,S_v) + \sum\limits_{i=1}^n (r-S_i) - \sum\limits_{(u,v) \in E} (r-\max(S_u,S_v))=\sum\limits_{(u,v) \in E} (S_u+S_v)+r-\sum\limits_{i=1}^n S_i\)

这个式子后面两项都是定值,先扔了。现在的问题变为,对所有 \(0 \le k \le Q\) 求:我们需要最小化在原图中扔掉任意多条边,再加入 \(k\) 条边后使图连通的 \(\sum\limits_{(u,v) \in E} (S_u+S_v)\) 的最小值。

首先 \(k=0\) 时显然答案会是原图的 MST。合理猜测对于任意 \(k\) 答案均是一棵树,且 \(k\) 的答案树由 \(k-1\) 的答案树删除一条原图边并加入一条新边得到。

那么考虑加删边这个过程,记 \(S_p\) 取到所有 \(S_i\) 的最小值,我们希望执行一个收益最大的操作,即删除 \((u,v)\),加入 \((u,p)\),最大化 \((S_u+S_v)-(S_u+S_p)\)。但是你发现这个操作需要支持忽略新边后的连通块分裂,这非常不好维护,因此考虑倒过来做连通块合并的问题。

倒过来后变为忽略新边后的连通块合并问题。\(k=n-1\) 时答案为其余点连向 \(p\) 的一个菊花,那么我们希望删除一个 \((u,p)\),加入一个 \((u,v)\),最小化 \((S_u+S_v)-(S_u+S_p)\),同时需要 \((u,v)\) 不在同一连通块。那么我们需要对每个连通块开一个堆维护每个连通块中连向其他连通块的边,并开一个全局堆维护所有可能的加删边操作。合并时使用启发式合并即可。

关于删除连通块内部边的问题,可以在尝试使用堆顶时先检查堆顶是否合法,若不合法则弹出堆顶继续检查。时间复杂度为 \(O(n \log^2 n)\)

Secret Lilies and Roses

考虑答案是什么。设共有 \(N_r\) 个 rose,那么我们对任意 \(i\) 均有 \(N_r-(i-l_i)=r_i\),代入条件 \(l_i=r_i\) 可得 \(i=N_r\)。也就是说,我们只需要找出这个序列中 rose 的数量,这就是答案。

根据上述式子我们知道,答案 \(N_r=i-l_i+r_i\)。所以我们现在希望对于一个下标 \(i\),通过若干个乘积的形式来凑出 \(r_i-l_i\)。观察移动下标 \(i \to i+1\) 时,\(l_ir_i\) 的变化:

  • \(i+1\) 为 lily,则 \(l_{i+1}r_{i+1}=(l_{i}+1)r_{i}\),变化量为 \(r_i\)

  • \(i+1\) 为 rose,则 \(l_{i+1}r_{i+1}=l_i(r_i-1)\),变化量为 \(-l_i\)

这启发我们去找到一对相邻的 rose-lily,记其中 rose 的下标为 \(x\),那么 \(x+l_{x+1}r_{x+1}-l_{x-1}r_{x-1}\) 即为答案。问题转化为如何在 \(8\) 次询问内找出一个这样的下标。

不妨设 \(0\) 处为 rose,\(n+1\) 处为 lily,考虑进行二分。每次若二分到的位置为 rose 则向右递归,否则向左递归,这样能够保证要么左侧是一个 rose,要么右侧是一个 lily,最终走到的位置一定有 rose-lily。

注意特判 \(x=1\)\(x=n\) 的 corner,这些都是平凡的。

询问次数为 \(\lceil \log_2n \rceil + 2\),可以通过。

[ROI 2025 Day2] 程序员的日常

待补。

[ROI 2023] Ultra mex (Day 1)

这个操作特别诡异,我们先来看看它有什么性质,以及尝试找到 mex-limit 的求法。

首先,若存在一个 \(k\) 使得 \([0,2^k)\) 中的数不全在集合中,那么其 \(\text{mex}\) 小于 \(2^k\)。因此进行 \(\text{Ultra}\) 操作后,原本在 \([0,2^k)\) 中的数还在 \([0,2^k)\) 中,而原本不在这个范围内的数操作后也不在这个范围,因此 \([0,2^k)\) 始终是不满的。故该集合的 \(\text{mex}\) 始终不会 \(\ge 2^k\)

这告诉我们,如果 \([0,2^k)\) 中的数不全在集合中,那么我们扔掉 \(\ge 2^k\) 的数,mex-limit 不变。

据此可以发现一个 \([0,2^k)\) 全部在集合中似乎是一个比较关键的条件。我们找到满足该条件最大的 \(k\) 进行研究。此时集合的 \(\text{mex}\) 至少是 \(2^k\)

观察到若 \(\text{mex} > 2^k\),那么异或上的数的第 \(k\) 位就为 \(1\),相当于交换 \([0,2^k)\)\([2^k,2^{k+1})\) 部分,再在内部进行变换。又由于 \([2^k,2^{k+1})\) 是不满的,根据我们上面的分析,我们可以把 \([0,2^k)\) 扔掉,\([2^k,2^{k+1})\) 部分全部减去 \(2^k\),不会改变集合的 mex-limit。

\(\text{mex} = 2^k\),说明我们要异或上的数就是 \(2^k-1\)。考虑此时有没有转化为上一个 case 的可能:只需考虑 \(2^k \oplus (2^k-1) = 2^{k+1}-1\) 是否在集合中即可。若不在,则操作后又回到原集合,说明此时 mex-limit 已经确定,为 \(2^k\);否则回到上一个 case 继续讨论即可。

这个推导还告诉我们:一个集合的 mex-limit 必定是 \(2\) 的幂。

那么直接对着这玩意胡一个 dp,考虑令 \(f_{i,j,k}\) 代表当前在 \([0,2^i)\) 中选数,\(0\) 必选(不然 mex-limit 一定是 \(0\)),选出的集合 mex-limit 为 \(2^j\),大小为 \(k\) 的方案数。假设 \(p\) 为最大的整数使得 \([0,2^p)\) 均在集合中,根据上述分析进行分讨:

  • \(p<i-1\),则直接扔掉 \([2^{i-1},2^i)\) 中的数,有 \(f_{i,j,k} \leftarrow \dbinom{2^{i-1}}{k-l} f_{i-1,j,l}\)

  • \(p=i-1\),则需分类讨论。若是 \(\text{mex} > 2^{i-1}\) 的情况,则 \([0,2^{i-1})\) 需要是满的,有 \(f_{i,j,k} \leftarrow f_{i-1,j,k-2^{i-1}}\);否则考虑 \(2^i-1\) 是否在集合中。若不在,则 mex-limit 已确定为 \(2^{i-1}\),方案数直接为 \(\dbinom{2^{i-1}-2}{k-2^{i-1}}\)(因为 \(2^{i-1}\)\(2^i-1\) 不能选);否则我们需要做一个钦定 \(2^i-1\) 不在集合中的问题,额外开一个 \(g_{i,j,k}\) 即可,转移与 \(f\) 类似。

  • 否则有 \(p=i\),直接判掉就行了。

直接做复杂度是 \(O(k4^k)\) 的,复杂度瓶颈来源于第一类转移。观察到转移是卷积形式,且保证了模数减一被 \(2^{18}\) 整除,因此直接上 NTT 优化,复杂度为 \(O(k^22^k)\)

卡常技巧:

  • 提前将组合数对应的多项式做 NTT,不要每次乘法做一次。

  • \(f\) 的卷积结果可以直接由 \(g\) 的卷积结果推出,不需要额外做一次卷积。

[AGC060 F] Spanning Trees of Interval Graph

待补。这个题太神秘了,放到最后再来研究。

[CTS 2026] 渡船

待补。

posted @ 2026-07-13 17:41  luqyou  阅读(26)  评论(0)    收藏  举报