像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

【题解】AGC059A My Last ABC Problem

蜜蜂的解释是智慧的!

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

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

将某个串的所有位置变的相同就是 a1=a2=a3==an

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

让相邻的 AB 为 ( , BA 为 )

让相邻的 AC 为 [, CA 为 ]

让相邻的 BC 为 {, CB 为 }

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

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

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

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

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

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

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

若剩下一段,不需要。

综上所述,答案为 d+[alar]2

蜜蜂的神秘解释:

可以看作一个环状序列,这样无论如何每次都能减少 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 @   寂静的海底  阅读(10)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起