题解 P949D Curfew
Luogu
前排提示,这是根据英文题解翻译所得
让我先假设这里只有一个宿管的方式来解决问题。在只有一个宿管的情况下,她的唯一的目标就是从左走到右的过程中,我们去最小化不符合条件的寝室数量。
我认定在这个情况下,以下方案为我的贪心策略:
- 让学生们从左向右跑
- 如果这里有太多的学生子啊一个寝室里,那么让多余的学生跑到下一个房间里
- 如果这个寝室的学生数目不满足寝室学生数目的标准,但是这个寝室的人数可能会被它右侧的房间的多余人数填补至合格,那么我们就去填补。
- 如果\(3\)不可能,那么就让所有的学生去之后的寝室
- 如果这个是最后一个房间,让多余的学生藏起来
这个贪心可以以\(O(N)\)的方式实现:把最初的\(a_{i}\)的用一个前缀和数组来维护。这样做可以让你快速的检查是否可能让学生去往之后的房间。
为了去计算到底右多少学生将会在之后的房间里被移走,你可以维护一个变量来表示学生所带来的代价。当你一开始考虑房间的时候,你先考虑你在这个房间里可以减少的最多的代价,然后按照上面的贪心策略来贪心。因此,当学生数目符合标准的房间位置的左右端点的移动是单调的时,代价就会减少
注意,现在你只要注意的条件:“不同的学生所经过道路中不会有重叠的道路”,意味着如果第一个学生原本就在\(i\)并且移动到\(a\),同时第二个学生是从\(j\)移动到\(b\),那么就会满足:\(j{\geq}i\)且\(a{\geq}b\)。因为如果不是这样,你就可以交换学生,并且最终答案不会因此改变。
贪心证明(你可以跳过这一段)
假设这里有一个更好的解决方案,使房间内人数为\(a_{1},a_{2}...a_{k}\)时达到更优解,而上面的贪心策略让房间内的人数为\(b_{1},b_{2}...b_{l},l\)<\(k\)。
我们假设在最优的方案里,所有学生的移动路径都是互不相交的,所以“多余”的学生都藏在随后一个房间,且所有的优质房间都是满员\(b\),或者是一个人也没有。否则就可以用一种方法去更改答案,使得符合标准的房间不会减少。
我们认定\(i\)是使得\(a_i≠b_i\)的最小的标号。由于贪心策略通常尽可能先填补满\(a_{i}\)房间,所以\(a_i\)与\(b_i\)的关系为\(a_i\)>\(b_i\)
但是如果\(a_i\)>\(b_i\),我们可以更改那个更优的方案,依据贪心的策略,将所有在\(b_i\)的学生转移到\(a_i\)
这样我们就可以增加符合标准的房间的数目。所以贪心正确
证明结束
让我们从新回归到原题:处理有两个老师的情况。回想一下一个条件——“最优方案下不同的学生的走的路线不会相交”。所以对于学生数目会有一个边界值,若边界值为\(x\),那么从\(0\)->\(nb\)的前\(x\)学生都会被一个老师所检查,剩下的被另一个老师检查到。
我们可以暴力枚举边界,并且用分治的方法去求解原数组的两边的答案。但是,这样做时间复杂度是\(n^2*b\),将会超市。我们需要更高效的寻找这个边界。
令\(f(m)\)成为第一个老师巡查的答案,即第一个老师检查\(m\)个人之后得到的房间数,\(g(m)\)就是第二个老师的答案。
很显然的是,当\(f(m)\)增加的时候,\(g(m)\)会减少。但要注意的是,两者都没有严格的单调性。实际上,一个老师得到要检查的学生越多,他就有越多的机会检查到合格的房间。(由于多余的学生会藏起来,所以并不会对答案造成影响)。
我们的目标就是找到一个\(m\),使得\(ans(m)=max(f(m),g(m))\),并且使得\(ans(m)\)会是最小的。让我们再引进一个变量\(z(m)=g(m)-f(m)\)——它也是增加的。(但是并不是严格的)
令\(m_0\)是\(z(m_0){\ge}0\)的最小下标。可以看到,\(min(ans(m_0),ans(m_0-1))\)是最终答案。的确,如果一个人尝试一个比\(m_0\)大的数字\(m'\),那么\(g(m')\)将成为\(max\)式子的主导地位,则\(ans(m_0)\)更优。否则,如果\(m