zoukankan      html  css  js  c++  java
  • 线段树beats

    有时,我们要维护一个数据结构,支持区间对x取min。
    如果只有区间max/min查询,则可以把区间的所有节点的值对x取min。
    标记可以合并,这样子时间复杂度是nlogn的。
    但是如果有了区间和查询,则不能这么做。
    虽然标记可以合并,但是无法更新区间最大值。
    考虑维护区间严格次大值m2和区间最大值的个数cnt和区间最大值mx。
    1.如果更新的值x<=m2,则递归下去继续修改。
    2.如果m2<x<m1,则所有m2会被更新为x,把当前节点的和加上(x-m2)*cnt,打上标记。
    3.否则直接退出。
    这样子时间复杂度是nlogn的。
    2,3操作都只会进行"1操作进行的节点次数"
    1操作进行一次,时间复杂度最坏是logn的
    每次会把一个节点的次大值和最大值合并。
    而最多会合并n次,所以时间复杂度是nlogn的。
    考虑有区间+时怎么做。
    定义当一个节点的max值和父亲的max值不同,这个节点是关键点。
    设势能为关键点个数。
    考虑DFS时的终止节点x,设它的父亲为f,那么有m1[x]=m1[f]或者m1[x]<m1[f]。
    其中经过第1次修改操作的点x开始关键点,但是在修改后不是关键点。
    设经过第1次修改操作的点数为A,那么访问的总点数一定是O(Alogn)的。
    时间复杂度为O(Alogn),而势能减少了A。
    在修改时,修稿了logn个节点,最坏的情况是这些节点都变为了关键点。
    下传标记时,一次修改最多下传logn个标记,势能最多+logn。
    所以查询最多令势能增加logn
    总时间复杂度nlog^2n。但是实践更像大常数nlogn。
    例题洛谷6242
    jzoj3992
    bzoj4695
    uoj515

  • 相关阅读:
    Eclipse 代码自动补全设置
    Ubuntu下MySQL的安装及远程连接配置等配置
    Ubuntu 8.04 下安装mcrypt扩展
    Android sdk manager 显示 “Done loading packages”,停下来不动了!
    「Clover 10」杯HE两校联赛(第二轮Day1)
    自招搞到了NUAA降分到一本线的优惠
    NOIP 2009 解题报告
    SD多校模拟赛Day1&Day2
    「Nescafé 29」杯HE两校联赛(第二轮Day2)
    临近比赛要淡定从容
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/13636964.html
Copyright © 2011-2022 走看看