1 条题解
-
0
测试点 1 :
暴力。
测试点 2~6 :
容易看出这是一个分段函数,形如:
$$F(x) = \begin{cases} A, & \text {x$\leq$ L}\\ x+T, & \text {L<x<R}\\ B, & \text {x $\geq$ R} \end{cases} $$我们只需要通过二分找到这个分段函数的三个断点,就可以在的时间回答每一个询问了。
测试点 7~11:
最多只有个取的位置,那么直接维护操作对应区间内的和,对于每一次询问,分段算答案即可,树状数组可以解决这个问题。
测试点12~16:
可以直接来处理取操作,就变成模板题了:
对于只有取操作的询问,我们可以构造一个如下的矩阵乘法操作:
对于一个当前的数字与取,我们只需要构造矩阵
$$\begin{bmatrix} 0 & \inf \\ v & 0 \\ \end{bmatrix} $$即可。
对于一个当前的数字加,我们只需要构造矩阵
$$\begin{bmatrix} v & \inf \\ \inf & 0 \\ \end{bmatrix} $$即可。
那么对于一次询问,就相当于是让矩阵依次乘以这些矩阵,由于上述矩阵的乘法依旧满足结合律,我们用线段树维护这些矩阵的乘积即可。
除此之外这个部分分还有一个单纯用线段树维护后续起作用的操作的位置的做法,大致结论是:对于任意一个位置开始向后,最多只有一个位置的取操作生效了,我们维护那个唯一生效的取位置即可,但这是某个验题人的做法,出题人并不清楚细节,所以不展开描述。
测试点1~20:我们知道这是一个分段函数,那么就可以直接在线段树上来维护它了。
参考测试点2~ 6,我们知道把任意一段区间的操作按顺序考虑,它都是一个形如测试点2~6题解所示的分段函数,如果我们知道区间对应的分段函数,以及区间对应的分段函数,那么我们可以在的时间内求出区间所对应的分段函数,那么我们就可以直接用线段树来维护这个分段函数,在的时间里完成一个修改操作的更新,在的时间里回答一次询问。
这个做法最难写的部分是合并两个分段函数,出题人的写法相对比较通用,直接用双指针来扫描两个分段函数的值域, 然后动态的合并它,常数比分类讨论略大。
- 1
信息
- ID
- 1662
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者