Segment Tree Beats

初始问题:给定一个序列(a),支持:

  1. 对于(lleq ileq r)(a_i)改成(min(a_i,x))
  2. 求区间和

我们每次取min,大多数情况下对于线段树上每个线段对应的区间来说,其中间的数的种类数是要减少的

如果每次都要减少,那么我们可以暴力,根据势能复杂度分析是(O(nlogn))

我们考虑不减少的情况,一种情况是区间最大值比(x)还小,那么我们记一个(mx)表示区间最大值,然后直接什么都不做就行

另一种是(x)仅比(mx)小,于是我们再记一个严格次大值,然后打一个只对最大值进行操作的标记

比次大值还小的情况下,数的种类数一定减少,暴力递归即可

复杂度还是(O(nlogn))的(如果有区间修改操作可能是(O(nlog^2n))?)

(\)

例题:【UR #19】前进四

我们离线询问,从后往前扫描,对时刻建线段树,考虑当前位置对每个时刻答案的贡献

显然每次操作都是对一个(a_i)变成(min(a_i,x))

直接上Segment Tree Beats

本题有一点卡常,所以我们修改时如果当前最大值比修改值要小就直接退出,然后基本就能过了

原文地址:https://www.cnblogs.com/invisible-eyes/p/13021158.html