HDU2024 R2 T9 题解
考虑维护一下每个点的速度。把区间加拆成后缀加和后缀减,然后考虑后缀加。减就同理。
考虑在一段后缀的目标速度增加之后,哪些时刻的加速度会变化。这里加速度必然只会变大 \(1\),因此在这个时刻之后的速度都会增加 \(1\),又由于目标速度也增加了 \(1\),所以这个位置之后的加速度都不再变化。因此加速度至多变化一个位置。这个位置就是修改位置后第一个速度与原目标速度相等 或 比目标速度大 \(1\) 的位置。因此只需要找到这个位置即可执行修改。这不太好维护,于是我们把维护的东西变成每个时刻的速度与目标速度之差。这样就变成某个位置后第一个 \(0 / 1\) 的位置。然后在修改位置和变化位置之间由于速度没有变化,但是目标速度增加了,因此还要支持区间加。对于减操作就是区间减和查询 \(-1 / 0\)。我们直接分块维护这个东西,每个块中存一个值域 \([-\sqrt{m}, \sqrt{m}]\) 的桶,查询时如果块的懒标记超过了范围,则直接重构这个块。桶内只需要记录每个数第一次出现的位置即可。
拆区间加,分快维护。