P10430 [JOIST 2024] 鱼 3 / Fish 3 题解
我们可以将一个操作区间分为3个部分。
一个前缀,只使用+1。
一个后缀,只使用+D
一个子区间,同时使用+1和+D.
对于前缀。很显然,这个前缀就是从右端点开始,向左端点的单调不增区间。
我们记录\(t[i]\)为最小的\(t[i]\)满足\(t[i]+k_iD=c_i\)
很显然,\(t[i] \equiv c_i \pmod D\)
我们记录\(t[l,r]\)为最小的\(t\)使得对于任意的\(i \in [l,r] ,c_i-t[l,r] \equiv 0 \pmod D\)
我们考虑怎么求。
一个区间直接求太复杂了,我们考虑两个\(i,j\)怎么求。
即我们要找一个\(t\) 使得 \(t-t[i] \equiv 0{\pmod D}\),\(t-t[j] \equiv 0{\pmod D}\)
我们发现,只有在\(|t[i]-t[j]| \equiv 0 \pmod D\) 的时候才成立。但是显然,由于我们求的是最小的\(t[i],t[j]\)所以不存在。
那么就要求同时-D和+1操作的区间内\(t[i]\)从右到左单调不增。
那么问题就变成了,我们要确定中间这个区间的位置/长度。
这个显然是可以预处理的。
然后我们要查询总共用了多少次\(-D\)。这个也可以预处理,线段树解决。
但是同时,我们希望\(+D\)操作的次数尽可能小,那么我们就要让中间操作区间的\(t\)尽可能多\(+D\)

浙公网安备 33010602011771号