题意简述
由于厌倦了支持范围携带,Keria 现在正在创建一个有关支持范围查询的数据结构问题。
对于长度为 $m$ 的数组 $b = [b_1, b_2, \ldots, b_m]$ 其中的 $b_i=0$ 或 $b_i=1$ ,请考虑下面的三重删除操作:
- 选择三个索引 $1 \le i, j, k \le m$ ,使得这些位置上的元素完全相同( $b_i = b_j = b_k$ )。
- 从数组中删除这三个元素。这一操作的代价定义为 $\min(k-j, j-i)$ 。删除后,数组的剩余部分将被连接,并重新标注其索引。
我们希望通过三重删除操作使数组 $b$ 为空。因此,我们将数组的总成本定义为将数组清空所需的三重删除操作的最小成本总和。如果不可能将数组清空,则成本定义为 $-1$ 。
凯里亚想要测试他的数据结构。为此,你必须回答 $q$ 个独立查询。最初,我们会给你一个长度为 $n$ 的数组 $a = [a1, a_2, \ldots, a_n]$ ,其中 $a_i=0$ 或 $a_i=1$ 。每次查询都会给你一个范围 $1 \le l \le r \le n$ ,你必须找出数组 $[a_l, a{l+1}, \ldots, a_r]$ 的代价。
思路分析
这道题的核心是注意到:
区间内 01 的排布仅有两种模式:完全交错和不完全交错。
如果不完全交错,即存在至少一个 $l \leq i \leq r$ 满足 $ai=a{i+1}$时:
我们取这两个及另外的一个,消除它们的代价为 $1$.
消除这一组后,$a{i-1}=a{i+2}$ 一定会拼到一起,形成一组新的消除三元组。
也就是说,一旦区间内存在一对连续的相同字符,我们就可以以这对为起点,不断消除并拼合两端的字符。
每次操作代价均为 $1$。所以这种情况下,总代价为区间内的三元组对数。即 $\dfrac{r-l+1}{3}$.
如果完全交错,即形成 $010101010\cdots$ 串,我们只需要任选一组进行一次代价为 $2$ 的消除,就能转化到不完全交错的情况。
所以此时总代价为 $2+(\dfrac{r-l+1}{3}-1)$.
具体实现的话可以预处理前缀不同值个数,即 $\text{pre}i=\text{pre}{i-1}+[ai=a{i-1}]$。
怎么培养注意力啊???为什么就是注意不到呢?
感觉可以手造几组数据玩玩。