【题解】AGC059A My Last ABC Problem

蜜蜂的解释是智慧的!

给出一个比较容易想到的解释方式。

首先把一个同颜色段缩成一个字母肯定不影响答案。

将某个串的所有位置变的相同就是 $a_1=a_2=a_3=\dots = a_n$。

最后有 $n-1$ 个相等的相邻位置,我们要改变所有相邻的不相同位置。

让相邻的 $\texttt{AB}$ 为 ( , $\texttt{BA}$ 为 )

让相邻的 $\texttt{AC}$ 为 [, $\texttt{CA}$ 为 ]

让相邻的 $\texttt{BC}$ 为 {, $\texttt{CB}$ 为 }

那么 ABCCBC 可以看作 ( { } { 。

那每次都可以消掉两个对应(左右或右左)的括号消去,即将二者中间那段的字母进行变换, $\texttt{AB\{CC\}BC}$ 使 $\texttt C\to\texttt B$。

这样无论如何都不会改变开头的和结尾的字母。

这样总是可以消去到只剩三个括号(四段字母)。

若剩下四段,则把不同的两个改成出现多的那种即可。

若剩下三段,若首尾相同则只需要一次,否则需要两次。

若剩下两段,只需要一次。

若剩下一段,不需要。

综上所述,答案为 $\lceil \frac{d + [a_l\neq a_r]}{2}\rceil$。

蜜蜂的神秘解释:

可以看作一个环状序列,这样无论如何每次都能减少 2 个不同位置(如有)。

所以答案就是上述。

拿个前缀和算下段数就行了,时间复杂度 $O(n+q)$。

read(n , q);
read(S + 1) ;
cnt[1] = 1 ; 
rep(i,2,n) {
    cnt[i] = cnt[i - 1] + (S[i] != S[i - 1]) ;
}
while(q --) {
    static int l , r; 
    read(l , r);
    static int dif ; 
    dif = cnt[r] - cnt[l - 1] - (S[l] != S[l - 1]) ; 
    wrt(S[l] == S[r] ? (dif + 1) / 2 : dif / 2 + 1 , '\n') ; 
}
posted @ 2022-12-07 13:10  寂静的海底  阅读(2)  评论(0编辑  收藏  举报  来源