有一个混厕和一个女厕以及 \(2n\) 个男/女士排队。若女厕为空,则最前面的女士会进入;队头的人会进入他能进的厕所(女性优先进女厕。)
每个人需要在厕所待 \(1min\)(切换不算时间)。你可以重排这个队列,使得这些人能在 \(n\) 的时间内解决完。并且要最小化一个人后移位置的最大值。
\(n \le 10^{18}\),输入是将给定 \(n, m, s_i, k_i(i \le m),\) 队列为 \(k_i\) 个 \(s_i\) 按顺序拼到一起。
先考虑如何判断一个序列受否合法。首先男士数量要 \(\le n\)。
不难发现,每时每刻厕所都要是满的。如果出现女厕为空,但没有女的了就寄了,也就是若出现了没有女士但有 \(\ge 2\) 个男士就寄了(一个可以进混厕,因为女士优先进女厕所以是对的)。
倒着考虑,若有一个后缀男士数 $\ge $ 女士数 $ + 2$ 就不行了,可以使用数学归纳法,最后肯定会剩两个男的。对于所有后缀均满足即可。
再贪心的考虑重排的方案:显然是男士前移,女士后移,且一定是最后的男士往前移。所以设一个后缀的男士数为女士数 \(+ k\),则需要最后 \(k - 1\) 个男士需挪到前面去(也就是有女士要从这 \(k - 1\) 个男士前挪到后面)。则答案为 \(\max \{ k\} - 1\),需对 \(0\) 取 \(\max\)。
要想到序列合法的条件(倒着考虑,剩下来的人少好分析),以及重排队列的最优策略。又一次没想到 正难则反。