给出几个矩形对角端点坐标,求这些矩形总体覆盖的面积。
基本思想以下图:算法
Update
相应区间的【厚度】或者【覆盖次数】CoverCnt+1。Update
相应区间的【厚度】CoverCnt-1。poj1511
求面积比较简单:
\[S = \Delta x * \sum_{cnt\gt 0}(raw(i+1)-raw(i))\]
便可。也就是每次Update后,增长面积便可。函数
CovertCnt不一致,出如今“断点”,即Update后,区间不连续。好比: Range[1-4].CovertCnt=2,如今Update(R[1-2])
, 如何处理?spa
干脆直接维护SumLen,出现这种状况,由下往上PushUp更新SumLen便可。code
从本质上来说,二者效果差很少,一个是立刻维护SumLen,一个是查询时再计算SumLen。后者省了一次函数调用,和有可能再次被“全区间覆盖”时简化计算,效率可以高一些。因此熟悉哪一种就用哪一种,切记切记,会10种不如精一种!blog
pushdown
吗?由于查询的是整个区间,不存在“交叉区间”,因此不须要。(固然PushDown【没毛病】,若是没有十足的把握,仍是PushDown,反正没有什么反作用。)事件
Query,当【查询区间】和【更新区间】出现【交叉】的时候,须要
PushDown
,好比:更新到:[1-2]
和[3-4]
但要查询[2-3]
,则只能由[2]``[3]
两部分构成,因此你必需要从[1-2]
PushDown到[2],从[3-4]
pushdown到[3]
。但若是永远查询都是[1-N]
的话,就不存在这种状况。class
hdu1828
道理基本上差很少,稍复杂。效率
每次Update
后,【周长的增长额】 = abs(【Update前SumLen】-【SumLen】)
\[ \Delta L_i= \sum_{cnt\gt 0}(raw(i+1)-raw(i)) \\ \Delta L = \sum_{i=0}^nAbs(\Delta L_i -\Delta L_{i-1} ) \]date
固然也有【一次】扫描的方法,不过须要维护更多的参数,更加复杂一些。通常状况下没有必要。方法