Segment Tree Beats
初始问题:给定一个序列\(a\),支持:
- 对于\(l\leq i\leq r\),\(a_i\)改成\(\min(a_i,x)\)
- 求区间和
我们每次取min,大多数情况下对于线段树上每个线段对应的区间来说,其中间的数的种类数是要减少的
如果每次都要减少,那么我们可以暴力,根据势能复杂度分析是\(O(nlogn)\)的
我们考虑不减少的情况,一种情况是区间最大值比\(x\)还小,那么我们记一个\(mx\)表示区间最大值,然后直接什么都不做就行
另一种是\(x\)仅比\(mx\)小,于是我们再记一个严格次大值,然后打一个只对最大值进行操作的标记
比次大值还小的情况下,数的种类数一定减少,暴力递归即可
复杂度还是\(O(nlogn)\)的(如果有区间修改操作可能是\(O(nlog^2n)\)?)
\(\\\)
例题:【UR #19】前进四
我们离线询问,从后往前扫描,对时刻建线段树,考虑当前位置对每个时刻答案的贡献
显然每次操作都是对一个\(a_i\)变成\(\min(a_i,x)\)
直接上Segment Tree Beats
本题有一点卡常,所以我们修改时如果当前最大值比修改值要小就直接退出,然后基本就能过了