• 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

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

  • 相关阅读:
    4 MyBatis动态SQL之trim元素|转
    2 MyBatis动态sql之where标签|转
    websql
    请求相关注意
    axios
    混淆器
    linux查看内存情况
    【Linux】查看系统内存占用
    Vim与ctags/cscope
    Linux初始root密码设置规则修改
  • 原文地址:https://www.cnblogs.com/invisible-eyes/p/13021158.html
Copyright © 2020-2023  润新知