P9338 [JOIST 2023] 合唱 / Chorus
题目描述
在舞台上,有 $2N$ 只海狸排成一列。它们是合唱团的成员。每只海狸唱着高音部或低音部。这些信息由一个字符串 $S$ 给出。具体地,如果 $S$ 的第 $i$ 个字符是 $A$,编号为 $i$ 的海狸(从右边看台来看)唱高音。如果 $S$ 的第 $i$ 个字符是 $B$,编号为 $i$ 的海狸唱低音。有 $N$ 只海狸唱高音,有 $N$ 只海狸唱低音。
从现在起,这些海狸将要演唱 $K$ 首歌。然而,因为所有歌曲非常复杂,每只海狸只唱一首歌曲,不会唱其他歌曲。此外,为了使歌声更加美妙,每首歌曲必须满足以下条件:
+ 至少有一只海狸唱这首歌。
+ 唱这首歌的唱高音和唱低音的海狸数量应当相等。
+ 如果只考虑唱这首歌的海狸,所有唱高音的海狸都在唱低音的海狸的右边。
指挥家 Bitaro 想找到一种方案,给出哪些海狸唱哪首歌,满足以上所有条件。由于 Bitaro 特别聪明,他注意到这可能无法实现。为了应对这个问题,Bitaro 将交换相邻两只海狸的位置多次,以便有一种方式可以调配海狸,从而满足上述条件。
由于 Bitaro 认为效率很重要,所以他想最小化要执行的操作数。然而,这是一个非常困难的问题。由于您是一位出色的程序员,Bitaro 请求您解决此问题。
编写一份程序,在给出合唱与演唱歌曲数量 $K$ 的信息时,计算 Bitaro 需要执行的最小操作数。请注意,在本任务的限制下,可以执行操作多次,以便有一种方式可以在海狸之间分配歌曲,满足上述条件。
输入格式
从标准输入读取以下数据:
> $N\ K$
>
> $S$
输出格式
向标准输出写入一行。输出应该包含 Bitaro 需要执行的最小操作数。
说明/提示
**【样例解释 #1】**
在该样例输入中,例如 Bitaro 可以进行如下操作。下划线表示被交换的两个海狸的位置。
1. 交换从舞台右侧数第 3 个和第 4 个海狸。
操作后,表示海狸部件分布的字符串变为 $\text{`\texttt{AA\underline{AB}BABBAB}'}$。
2. 交换从舞台右侧数第 8 个和第 9 个海狸。
操作后,字符串变为 $\text{`\texttt{AAABBAB\underline{AB}B}'}$。
操作完成后,Bitaro 可以按如下方式分配歌曲:
- 从舞台右侧数第 1, 2, 3, 4, 5, 7 个海狸演唱第一首歌
- 从舞台右侧数第 6, 8, 9, 10 个海狸演唱第二首歌
这种分配方式满足条件。若操作次数少于 2 次,则不存在满足条件的分配方式。因此输出 2。
该样例满足所有子任务的限制。
**【样例解释 #2】**
不进行任何操作时,Bitaro 可以按如下方式分配歌曲:
- 从舞台右侧数第 1, 2, 3, 5 个海狸演唱第一首歌
- 从舞台右侧数第 4, 6, 7, 8 个海狸演唱第二首歌
- 从舞台右侧数第 9, 10 个海狸演唱第三首歌
这种分配方式满足条件。因此输出 0。
该样例满足所有子任务的限制。
**【样例解释 #3】**
该样例满足所有子任务的限制。
**【样例解释 #4】**
该样例满足所有子任务的限制。
**【数据范围】**
对于所有测试数据,满足 $1 \le N \le 10^6$,$1 \le K \le N$,$S$ 是长度为 $2N$ 的字符串,且其中字符 $\verb!A!$ 和 $\verb!B!$ 各出现 $N$ 次。保证 $N,K$ 均为整数。
| 子任务编号 | 分值 | 限制 |
| :----------: | :----------: | :----------: |
| $1$ | $16$ | $N \le 10$ |
| $2$ | $24$ | $N \le 500$ |
| $3$ | $21$ | $N \le 5000$ |
| $4$ | $26$ | $N \le 10^5$ |
| $5$ | $13$ | 无 |
提示说明部分,翻译由 DeepSeek R1 完成