abc 402

这次的题都很有意思!

本文的目的在于剖析如何快速切掉 ABCDEF,获得两三百的好名次。

首先 AB 直接模拟就行,不讲。预计时间:3 min。

C - Dislike Foods

首先题意有 \(m\) 个序列,每个序列有一些数,总共数的个数不会超过 \(3 \times 10^5\),所有数的范围是 \(1\)\(n\)\(n\le 3 \times 10^5\)

现在有 \(n\) 个询问,每个询问将 \(a_{i}\) 变成“拥有的”,输出满足所有数都是拥有的序列的个数。

考虑一个序列,他如果在一个询问计入了答案,接下来也会被计入答案。

因此,我们只需要求出一个序列第一次计入询问的时候,在一个数组中对于这个询问的位置加一,每个询问的答案就为所有前面的询问的数组前缀和(包括自己)。

对于一个序列,他第一次计入答案的询问,就是序列中所有数在 \(a\) 中出现的最大位置。

预计时间:7 min。

D - Line Crossing

考虑看样例,发现两条直线平行,当且仅当经过的端点和模 \(n\) 的值一样。用 map 记录即可。

预计时间:4 min。

E - Payment Required

看数据范围:\(n\le 8\),考虑排列或者状压。

对于一个任务,如果我们之前完成了,那么这次的策略可能会有些改变,题面里也着重强调过。

对于当前的钱,影响这我们能否做任务。

我们做决策的优劣只和这两个东西有关系,记录这两个状态。我们对于一个状态枚举接下来选择的任务,根据通过概率从子结构转移去最大期望分数即可。

预计时间:15 min。

F - Path to Integer

题目有点奇怪。

我们暴力肯定不行,考虑动态规划也不行,因为我们不能知道后面最优的状态究竟通过什么来比较。我们唯一能够记录后面状态的方式只有将所有能够取到的值的记录下来。但是如果所有都记录,和爆搜没区别,因为我们需要记录所有的东西。

有一个思路来源双向搜索,就是我们从起点先搜一半的路程,记录到达一个格子的所有的当前答案。再从终点搜后一半的路程,此时有一个当前答案,考虑当前格子前半部分的答案和后半部分结合怎么样答案最大。后半路程当前答案固定,前半路程的最优选择仅在两个选择中取合并后最大的一个(注意:我们所有的记录当前答案都是模过的,以下也在模下讨论大小关系),设后半路程的当前答案为 \(now\)

  1. 最大值。

  2. 最大的小于 \(m-now\) 的数。

然后我们只需要在所有后半程搜索的终点合并最优答案,然后再更新全局答案,这样得到的就是最优答案了。

我很好奇这到底为什么可以减少时间复杂度,我意识到,这实际上是除去了前半段路程的后半程不优决策的枚举。

预计时间:20 min。

总计获得 114 名的好成绩。

posted @ 2025-04-21 18:55  PM_pro  阅读(70)  评论(0)    收藏  举报