如厕计划-题解
toilet
思路分析
为了 \(n\) 分钟之内结束,两个厕所一刻都不能停。由于男生不能进女厕,所以一个男生必须要和一个女生一起才能上厕所(奇怪啊)。如果把男生视为 \(1\),女生视为 \(-1\),那么对于任意位置,后缀和必须要小于等于 \(1\) 才能保证成功。(后缀和为 \(1\) 时多出来的那个男生可以跟着他之前的女生走)。
如果出现了后缀和大于 \(1\) 怎么办呢?就需要把一些男生放到前面去。如果累计的男生个数有 \(x\) 个,则至少要放 \(x-1\) 个到女生前面,则答案应该对 \(x-1\) 取 \(\max\)。
这样的话,考虑从后往前扫描字符串,用一个变量来存储后缀和,当后缀和大于 \(1\) 时,更新一下答案。
然后考虑怎么处理重复字符串。容易想到,重复的字符串对于后缀和的影响是相同的,并且无论影响是正是负,对答案有影响的只有可能是第一个串和所有串连在一起。所以维护一个字符串产生的后缀和变化量 \(delta\) 以及变化过程中的最大变化量 \(maxdelta\),如果一共重复 \(t\) 次,并且在这个字符串之前的后缀和是 \(cnt\),那么在这些重复的字符串中,最大后缀和是 \(\max(cnt+maxdelta, cnt+maxdelta+delta\times(t-1))\),而对总后缀和的影响是 \(cnt \leftarrow cnt + delta\times t\)。
最后看一下无解:如果总后缀和最终大于 \(0\)(\(1\) 也不行,如果是 \(1\) 第一个男生无法上厕所),说明男生过多了,则输出 \(-1\)。否则输出过程中的最大后缀和减一。
AC 代码
1 |
|