【2020.11.24提高组模拟】变换 (transform) 题解

【2020.11.24提高组模拟】变换 (transform) 题解

题意描述

给一个大小为\(n\)\(01\)\(A\),点编号为\(0,1,\dots,n-1\)。每一个点\(i\)都与\((i+1)\texttt{ mod }n\)之间有一条边。

初始时,每个点有一个\(0\)\(1\)的权值。

定义一次变换:对于每个点,若与其相邻的两个点的颜色一样,则这个点会变成相邻点的颜色,否则不变化。再一次变换中,所有点是同时变换的。

\(f(A)\)表示环\(A\)要变换多少次之后才能稳定。若永远不稳定,\(f(A)=-1\)

有q个区间覆盖修改,求每次修改后的f(A)。

\(n,q\le500000\)

Solution

首先可以推出来有两个结论

  • 连续相同的串不会有变换。

  • 连续不同的串会一直变换,变换次数是\(\frac{len-1}2\)

如有一个环上最长的\(01\)交替是这样的:\(10101\),长度为5

那么默认前/后都是和首/尾相同的数字:\(11110101111\)

手推经过两次后:\(1111101111111\Rightarrow11111111111\)

偶数也是一样的。

线段树上维护这个环最长的\(01\)交替子串即可。

区间内最长的\(01\)交替,从左开始的\(01\)交替,从右开始的\(01\)交替。维护区间内的\(01\)最大长度即可。

而在环上的话就把首尾判一下即可。

Code

posted @ 2020-11-25 10:09  Vanilla_chan  阅读(213)  评论(0)    收藏  举报