zoukankan      html  css  js  c++  java
  • 李超线段树学习笔记

    Hints

    原理

    对于每一个区间,维护这个区间中点权值最大的直线是谁。

    凡是可能有贡献的直线,一定被统计了。

    思想

    首先想到的就是维护每一个点,这样的时间复杂度是(O(n)),所以想优化。

    对于一段区间,如果新的直线全面覆盖,就打一个标记。

    但是这样的区间很少。

    所以不妨增大查询的时间复杂度到(O(log n)),维护出可能作为答案的线段。

    所以假设一条线段可以作为一大段区间的点的贡献,加在线段树里面。

    但是有可能一个区间里面的两条直线相交。

    那么就只维护完全包含于这个区间的线段(剩下的维护在子区间当中),考虑什么时候可以作为答案。

    就是中点处值最大的线段。

    理由:假设有一条线段中点处权值更大,那么左右两个区间一定有一个区间被上面的线段完全覆盖,也就是我们维护的线段只对两个区间的一个有贡献。

    不如维护成上面的那个,而把下面的那个丢到子区间当中呢。

    细节

    细节主要体现在(xl==xr)这个地方,这里可以在结构体(f())里面特判,原因是我们调用(k())的时候一定保证了(xl eq xr)

    评价

    神奇

    例题

    P4097 [HEOI2013]Segment

    Code

  • 相关阅读:
    随笔
    第一次随笔
    团队战day02-接口
    团队战day01-初步搭建UI
    团队战start-确定项目以及介绍
    团队—易软
    找回感觉的练习
    第五次作业-团队作业-团队组建
    第四次博客作业-结对项目
    java第九次作业
  • 原文地址:https://www.cnblogs.com/ChiTongZ/p/11272617.html
Copyright © 2011-2022 走看看