快速查询
仔细读题会发现修改和查询只有单点和全局的
然后考虑到操作次数比较多,但涉及到的单点的数量是 O ( q ) O(q) O(q) 的,于是把所有涉及到的单点离散化之后就能做到 O ( 1 ) O(1) O(1) 的修改查询
核心思想就是把涉及到的单点用一个栈来维护,然后假设把它变成 v v v ,放入栈中的值就应该是 v ′ = v − a d d m u l v'=\frac{v-add}{mul} v′=mulv−add ,这个可以线性筛逆元预处理,注意还有一种乘 0 0 0 的情况,可以想象成全局覆盖成 0 0 0
CODE
染色
手玩一下发现只需要考虑有颜色的列,无颜色的空段可以直接 d p dp dp 预处理出转移系数,即我们只考虑两边颜色的情况,有以下几种:
{ ① = [ a a b b ] ② = [ a b b a ] ③ = [ a a b c ] [ a c b b ] ④ = [ a c b a ] [ a b b c ] ⑤ = [ a c b d ] \begin{cases} ①= \left[ \begin{matrix} a&a\\ b&b \end{matrix} \right]\\ ②= \left[ \begin{matrix} a&b\\ b&a \end{matrix} \right]\\ ③= \left[ \begin{matrix} a&a\\ b&c \end{matrix} \right] \left[ \begin{matrix} a&c\\ b&b \end{matrix} \right]\\ ④= \left[ \begin{matrix} a&c\\ b&a \end{matrix} \right] \left[ \begin{matrix} a&b\\ b&c \end{matrix} \right]\\ ⑤= \left[ \begin{matrix} a&c\\ b&d \end{matrix} \right]\\ \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪