QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: GotoHiotori

Posted at: 2026-05-19 21:12:26

Last updated: 2026-05-20 08:46:55

Back to Problem

你喜欢可爱小汤圆吗

不妨认为 $n,m,k$ 同阶。

要求操作序列是排列很难受,我们先考虑一下操作之间的互相影响,可以发现如果先 chkmin $x$ 再 chkmin $y$ 且 $x\geq y$ 的话那么前者没意义,所以有效的 chkmin 是所有后缀最小值,也就是我们只需要确保 c 最小的 chkmin 被执行了就好了。

再考虑 chkmin 对区间 chkmax 的影响,发现相当于将它之前的所有 chkmax 的 $c$ 做了一次 chkmin,而且我们其实不需要确保每个 chkmax 都执行恰好一次,只要至少做了一次就可以,因为同一个 chkmax 肯定是后一次更有效。

然后再看一下初始序列,初始序列可以视作强制初始执行了的 chkmax,所以如果初始值大于等于最小的 chkmin 的 $c$ (不妨记为 $c_0$)就等效于它初始是 $c$,否则我们考虑下如果有 $c\geq c_0$ 的 chkmax 覆盖它的话,最后一定不会小于 $c$,于是还是等效于初始是 $c_0$,否则的话任何 chkmin 对它无效,结果是确定的,仍然和初始就是 $c_0$ 没区别,也就是我们证明了初始序列根本无用,可以视作初始全是 $c_0$。

因此可以删掉 $c\leq c_0$ 的区间 chkmax,剩下的操作你发现如果你不想做它就把它放到操作 chkmin $c_0$ 前面,就根本不会产生影响,因此你甚至连必须操作某个 chkmax 的限制都没了。

你现在其实就只是很多个区间 chkmax 操作了,具体来说就是原本的每个 chkmax 可以把 $c$ 改成某个 $c'$ 满足存在 chkmin $c'$,然后你可以选择执行其中的任何一个子集,问可以得到多少种序列。

因为你已经没有执行顺序了,可以按照 $c$ 升序,相当于区间覆盖问题,是叶子 dfn 序是 $1\sim n$ 的树形结构,直接暴力区间 dp 就是 $\mathcal{O}(n^5)$,比较糟糕的是你需要预知一下 $r$ 在哪里才能决策这个位置是否可以直接被当前权值覆盖掉,那你发现对于一个权值如果被 chkmin 过,你在某一段填更大的权值也不会使得你能覆盖到的区间发生改变,于是你只需要预处理每个 $[l,r]$ 能不能被并出来,然后先不管能不能覆盖上做一遍再只选能被并出来的区间更新上去;而权值不是被 chkmin 过的区间操作只有 $k$ 个,这样你只在意的本质不同的 $r$ 区间数对于每个权值的总和也就是 $\mathcal{O}(k)$ 的,因此最后复杂度还是四次方的。

Comments

avatar
Qingyu
0000