Loading

[JOI Open 2024] 中暑

原问题的规则实际上很大程度上是为最小化而设计的,但是我们却要求的是最大化,这意味着原问题的规则实际上是与我们要最优化的问题相矛盾,可行的办法可能是通过一些转化使新问题与规则刚好契合。

考虑原问题的规则实际上告诉我们只有当两边都不能放的时候才会对答案产生贡献,意味着实际上最优化的其实是尽可能制造两边都满的位置,第 \(i\) 条路上的人会产生贡献当且仅当 \(i\)\(i+1\) 都被放满。

实际上可以发现这样的转化是非常好的,如果我们无视一个位置放满了就不能再被放的限制,问题的结果不会发生改变,这是因为如果一个位置放满了再继续放,这样不如放一个没有放满的位置,这样会使位置变得更加满从而使得答案尽可能的最大化。这意味着原问题的规则在转化问题中就是用来最大化,这是非常契合的。

考虑如果确定好了每一个位置被占据的时间 \(t_{i}\),则第 \(i\) 条道路上的人会产生贡献当且仅当其到达时间比 \(\max(t_{i},t_{i+1})\) 要大。这样如果 \(t\) 序列确定,答案也就确定了。

考虑怎样的 \(t\) 序列是合法的,对于每一个位置 \(i\),要求在 \(t_{i}\) 之前第 \(i-1\)\(i\) 的道路占据 \(i\) 的大于等于 \(C_{i}\) 个。这实际上是一个匹配问题,使用霍尔定理后实际上变为判定对于一个位置集合 \(S\),其邻域 \(N(S)\) 的人数都要大于等于 \(S\) 集合的 \(C\) 之和。

考虑如果 \(S\) 是若干段连续的区间且 \(S\) 不合法,那么根据抽屉原理至少有一段区间满足其也不合法,所以实际上只需要判定区间即可。实际上可以归约为最小子段和,可以简单 \(\text{dp}\) 判定。

那么实际上只需要 \(\text{dp}\) 一个 \(t\) 序列,内层 \(\text{dp}\) 级记录一下最小后缀和,判定其是否时刻 \(\geqslant 0\) 即可。由于每个位置 \(i\) 取到的 \(t\) 的集合 \(T_{i}\),只会在相邻的两条道路上的人的到达时刻(特别,最后的一个时刻要置为极大值)与 \(0\) 处取到,所以 \(\sum_{i=1}^{n} T_{i}\)\(O(n)\) 级别的。而每个点 \(i\) 只需保留 \(T_{i}\) 个时间,每个时间保留 \(T_{i}\) 个最小后缀和,转移到 \(T_{i+1}\) 个状态,复杂度为 \(O(\sum_{i=1}^{L-1}T_{i}^2T_{i+1})=O(n^3)\) 的。但出题人没有刻意卡所以可以拿到 \(95\) 分。

实际上如果事先将取到极大值的最后一个时刻忽略,每一个转移可以拆成一段前缀向一个点和一段后缀向一个点的转移,取前后缀 \(\text{max}\) 即可变成 \(O(\sum_{i=1}^{L}T_{i}^2+\sum_{i=1}^{L-1}T_{i-1}T_{i})=O(n^2)\),常数很小,速度很快。

posted @ 2024-06-19 19:51  zhouhuanyi  阅读(30)  评论(0编辑  收藏  举报