1 条题解
-
0
自动搬运
来自洛谷,原作者为

cmk666
伊娜可爱捏 伊娜贴贴捏搬运于
2025-08-24 22:59:44,当前版本为作者最后更新于2024-06-19 09:05:13,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
sub 1
直接贪,能往右方就往右放。
sub 2,3
状态数只有 ,直接爆搜。
sub 4
到这个开始就比较有脑子了。
考虑对于每个人,我们只关心的状态是:她是向左,还是向右,还是贡献到答案。那么一个状态合法,当且仅当:不存在一个医院接受了 个人;也不存在一个人在两边的医院至少有一个有空位的时候算入答案。
容易发现 check 医院是否合法的时候,只要用到 和 位置的人的决策。据此 dp 即可。而由于 ,一条路上只有前 个人是有用的,后面的人必然是算入答案的,那么状态数就是常数的,直接做就是线性。
sub 5
没了 的限制,上面的 dp 状态数都是指数级的,做不了一点。但是我们仍然可以沿用类似的 dp 思路。
事实上,check 的时候没必要记录所有人的决策。考虑定义 dp 状态 表示:当前到第 条路,往第 个医院送了 个人,且第 个医院将会在 时刻变满,或者当 ,表示永远不满。
转移的时候直接枚举 ,那么若 ,则第 条路上 的人都要往右送,也就是限制了 的一个下界;同时,记 第 条路上 中的人数,那么容易得到往左送的人数为 ,于是对于医院 有 ,当且仅当 时取等。然后还有一些边界上的特判,是 trivial 的。
由于 两维的总和是 的,于是状态数是 的,加上一些煎蛋的预处理后,直接暴力转移复杂度为 ,可以通过 sub 5。实现的时候需要把不合法位置及时赋值为 避免影响答案,然后如果你不想写
std::vector这种动态开空间的东西需要滚动数组,注意每次清空的大小。sub 6
状态数已经足够优秀,考虑减少转移次数。
考虑转移时的这个条件( 定义同上):对于医院 有 ,当且仅当 时取等。
那么可以发现,对于一对固定的 ,只有 对 可以转移到她!原因是:
- 若 ,则上式取等,得到 ,那么枚举 便能确定 进而 只有唯一的一种可能,于是共有 个转移;
- 若 ,那么枚举 ,也只有 个转移。
那么转移的复杂度被降到了 ,总复杂度 。
sub 7&8
对于 的定义中含有 ,很麻烦,不妨拆之。也即,把转移分成三种:、 和 (这种是上一个 sub 拆出来的)。容易发现她们都是求上一层 dp 数组的区间 ,直接上线段树,复杂度 ,可以通过 sub 7。
更进一步的,观察到有一个端点是只跟某个下标相关的,于是实质上求的是前后缀 ,没必要使用线段树。于是可以做到时空复杂度 ,至此得以通过此题,完结撒花!
- 1
信息
- ID
- 10397
- 时间
- 2000ms
- 内存
- 2048MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者