专栏文章
CF1608F MEX counting - Solution
CF1608F题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mincdgjp
- 此快照首次捕获于
- 2025/12/02 00:06 3 个月前
- 此快照最后确认于
- 2025/12/02 00:06 3 个月前
从这题出发,我决定用一个比较基础的视角来看贡献延迟计算。
首先贡献是一个比较抽象的东西,你可以理解为我们把要算的东西拆成了很多个部分,每个部分之间它们的关系就是贡献。
贡献延迟计算就是考虑到,我们确定了当前位置的值,可能当下并没有影响,但是往后跟它取值相同的那些点,贡献又跟它不同了。这时候我们几乎不可能简单地算出来我们要求的东西。
我们的问题在于哪呢?因为前面有可能选择了当前取值的点,已经计算了它们的贡献,接下来还想继续算的话,我们可能不得不考虑已经选了那些当前取值的点,复杂度指数。
问题就在于前面这些“当前取值”的点贡献计算太早了,让它们在情况变化的时候赶不上变化。
为时尚早,面包机。
这类问题有一种非常鲜明的特征:对于取值相同的点,它们前后不同的状态总体上有二界性。
--
我认为做到这题的人,应该很多人是被 CSP-S2025 T4 引流过来的:
典型的,比如 CSP2025 employ 这道题,我们确定了选了 个,其中拒绝了 个人,问题就在于,我们并不知道其余没选的 中到底还有多少,是 以后还能产生贡献的,我们似乎一定要记录具体的 的状态,这样一定爆炸。
但是你仔细分析性质,就会发现我们决策 拒绝还是不拒绝,也就是 这个过程。那些 的点,我们早知道往后它们都会跑路。 的点, 它们的影响改变的时刻还未到来。现在决策 ,可能会导致贡献改变的都是那些 的点,它们从可以录用也可以拒绝,变成了遇上就会跑路。那么之前我们填的 的数,为什么我们这么前面就要填它们呢,为什么不到现在再来填呢?!我们就直接假设前面已经填的 的位置全部都是未知的,不考虑它们贡献的,那么我们面前就是一个旷野啊!
这样我们为了分开 前后 的位置的贡献,只需多记录一个已用了 个 的位置。前面 个位置,我们枚举 个 的,贡献是桶的组合数和关于 的排列数,再乘上 位置满足我们决策的选取方案,清晰明了简单极了!
如果你要一个形象的比喻:
-
线段树的懒标记跟它思想是很类似的。
-
无需时刻保持敏感,迟钝有时即为美德。尤其与人交往时,即便看透了对方的某种行为或者想法的动机,也需装出一副迟钝的样子。此乃社交之诀窍,亦是对人的怜恤。
再来想想这道题,我们要让前缀 序列的每个元素跟 的距离 。
最经典的,我们令 代表前 个数 是 的方案数。
令前缀的 ,那么我们前缀已经考虑到的数的集合,真的是两眼一黑啥情况都不知道,我们随便在 填一个数,都可能会导致 的剧烈变化,这怎么可能做得了呢!
既然大于 的,我们知道在 以前,它们除了当个占位符没任何用处,那之前我们连它们当占位符的贡献都懒得考虑。
那么为了在情况变化的时候算贡献,有什么信息是需要额外记录的呢?当然是像上面那题一一样,记录前 个数有多少种大于 的数被用过(如果你记录位置数也能做,但是你会得到一个极难继续优化的形式)。
为前 个数,, 种 的数已经被用过。我们只考虑 的数的排列,和这 个 的数颜色可重集关系的方案数。
先来考虑 不变的贡献, 不变当且仅当 ,这当然是普及组难度:
填入的数小于 :在小于 的数中选取一个,。
填入的数大于 :1. 填入的数在 个数中,同上 。2. 不在,这时候当然不用考虑,。
现在考虑填入的数是 ,我们的 是 ,要变成 ,那么:
- 前面 都要出现过,有顺序的填入到 个空中,要求所有空都被填上(为什么是 个空,因为我们已经考虑完了颜色可重集关系,现在只需要考虑将每个颜色填好)。不难发现这是经典插板法。
我们有:
答案计算也是乘类似的排列数,比较简单。
只保留有效状态复杂度是 的。
想办法优化一下复杂度,其实可以直接做了但边界上很麻烦,我们变形一下,令 。
把 提出去然后维护前缀和即可,复杂度 。
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...