题目大意
给定一个长度为 nnn 的 010101 串,有两种查询,第一种查询为反转区间 [L,R][L,R][L,R] 的 0 和 1 ,第二种查询为判断子串 [L,R][L,R][L,R] 是否为好字符串,好字符串的定义为字符串中任意连续的 222 个字符都不相同的字符串是好字符串。
解题思路
不妨设长度为 n−1n-1n−1 的序列 is=(is1,is2,...,isn−1)is=(is_1,is_2,...,is_{n-1})is=(is1 ,is2 ,...,isn−1 ) ,如果 si=si***_i=s_{i****i =si+1 ,则让 isi=1is_i=1isi =1 ,否则 isi=0is_i=0isi =0 。
对于第一种查询 1 L R ,由于区间 [L,R][L,R][L,R] 内的相邻字符的关系不会发生改变,所以对于整个序列 isisis ,只有 L−1L-1L−1 和 RRR 的位置发生改变,即修改 isL−1is_{L-1}isL−1 为 1−isL−11-is_{L-1}1−isL−1 以及 isRis_{R}isR 为 1−isR1-is_{R}1−isR 。其中,如果 L=1L=1L=1 或 R=nR=nR=n ,则对应序列位置不发生改变。
对于第二种查询 2 L R ,如果 isL=isL+1=⋯=isR−1=1is_L = is_{L+1} = \cdots = is_{R-1} = 1isL =isL+1 =⋯=isR−1 =1 ,那么答案为 Yes ,否则为 No 。
对于以上操作,可以使用线段树或树状数组进行维护和查询。
参考代码