zoukankan      html  css  js  c++  java
  • [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957

    分析:

      根据题意,就是比较斜率大小

      只看一段区间的话,那么这段区间能看见的楼房数量就是这段区间的单调栈的大小

      那么这题就是用线段树来维护这个单调栈

      len[k]表示对于区间k来说单调栈的大小是多少

      那么自底向上maintain(k)的时候,len[k]=len[lson]+find(rson,max[lson])

      find(k,x)就是表示以数字x进去k区间,那么能走的步数是多少

      那么find(k,x)怎么求呢?

      ①如果x>max[lson],就说明左区间贡献是0,那么该答案就是find(rson,x)

      ②如果x<=max[lson],那就说明左区间是有贡献的,那么该答案就是find(lson,x)+find(rson,max[lson])

      等等,对于情况②,我们两边都要递归下去,那岂不是复杂度退化到O(n)了?

      其实我们发现这个find(rson,max[lson])是没必要递归下去的,可以提前预处理(实际上,该值等于len[k]-len[lson],因为是自底向上合并信息,所以len[k]与len[lson]已经求出来了)

      时间复杂度是O(nlog^2n)的

  • 相关阅读:
    C++ Primer 第五版-1.1
    C++ Primer 第五版笔记-1.0
    TouchID
    正则表达式
    duplicate symbol 错误
    第三方登录
    AFNetWorking
    IOS---通知
    左右点击--日期增减
    Xcode相关设置
  • 原文地址:https://www.cnblogs.com/wmrv587/p/3843681.html
Copyright © 2011-2022 走看看