给定$n$堆积木,第$i$堆初始数量为$a_i$,两个筛网参数$p,q$($p
- 选择一段长度至少为$k$的连续积木区间$[l,r]$;
- 选择$m \in \{p,q\}$,将区间内每一堆的数量更新为$a_i \leftarrow a_i \bmod m$。 求经过任意次操作后,所有积木剩余总数的最小值。
数据范围:$1 \le T \le 10^3$,$1 \le k \le n \le 1e5$,所有测试数据的$n$之和不超过$1e5$,$1 \le a_i,p,q \le 1e9$,$p
性质1
$(a_i\mod p) \mod q \le a_i \mod p$ ,这个的观察和证明都是比较简单的,意思就是说对于 $\mod p$ 操作后紧跟着一个 $\mod q$ 是一定不劣的。
性质2
我们不难发现我们对于操作对 $p$ 取模后无论如果取模就不会改变其大小,于是结合对于区间操作长度不确定的题目的一个固定思考方向:能否转化为长度为 $k$ 的定长操作?
答案是可以的,我们可以先对于一个区间做 $\mod p$ 或者 $\mod q \mod p$,然后类似于滑动窗口一样,每次都对一个新的数字做操作,其余的由于操作完成故不会影响,这些除了一开始的 $k$ 个数字外都能取到最小值。
我们结合上面两个性质,这个题目就很简单了:
预处理好每种操作的最优答案的前缀和,然后枚举区间长度进行计算,详细来说就是这样:
对于每个位置$i$,定义:
- $b_i = a_i \bmod p$:对第$i$堆积木直接使用$p$筛网后的结果;
- $c_i = a_i \bmod q \bmod p$:对第$i$堆积木先使用$q$筛网、再使用$p$筛网后的结果;
不难想到前缀和
- $sum_b[i]$:前$i$个位置的$b_i$之和,$sum_c[i]$:前$i$个位置的$c_i$之和,$sum_{min}[i]$:前$i$个位置的$\min(b_i,c_i)$之和。
遍历所有长度恰好为$k$的连续区间$[L, R]$,对每个区间,计算两种选择的总和:
- 选择1:区间内统一使用 $\mod p$ ,总和为 $sum_b[R] - sum_b[L-1] + sum_{min}[L-1] + (sum_{min}[n] - sum_{min}[R])$;
- 选择2:区间内统一使用 $\mod q \mod p$ 筛网,总和为 $sum_c[R] - sum_c[L-1] + sum_{min}[L-1] + (sum_{min}[n] - sum_{min}[R])$。
取两种选择中的较小值,作为当前区间的最优总和。
所有区间的最优总和中的最小值,即为最终答案。