惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - headchen

博文阅读密码验证 - 博客园 二进制集合运算 - headchen - 博客园 OI中字符串读入和处理 完全二叉树的性质 评论备份(3) 评论备份(2) 用户中心 - 博客园 二分法的注意事项 sam模板 二分图相关 KMP算法详解 用户中心 - 博客园 中国国家集训队论文集目录(1999-2009) 最短路Dijkstra算法的一些扩展问题 用户中心 - 博客园 async await 异步编程杂记 IOS 杂记 合并 ios 静态库 android studio 偶记
扫描线算法
headchen · 2018-06-12 · via 博客园 - headchen

扫描线算法

给出几个矩形对角端点坐标,求这些矩形整体覆盖的面积。
基本思想如下图:

  1. 先离散化。
  2. 【扫描线】是一根想象中的虚线,从左往右扫描,遇到【矩形】则成为【事件】。
  3. 遇到【起始边】,则 Update 相应区间的【厚度】或者【覆盖次数】CoverCnt+1。
  4. 遇到【结束边】,则Update 相应区间的【厚度】CoverCnt-1。
  5. 用【线段树】维护【区间】的厚度CovertCnt,以及区间CovertCnt > 0 的线段的总长度Len。

求面积poj1511

求面积比较简单:

\[S = \Delta x * \sum_{cnt\gt 0}(raw(i+1)-raw(i)) \]

即可。也就是每次Update后,增加面积即可。

如何处理CovertCnt的不一致?

CovertCnt不一致,出现在“断点”,即Update后,区间不连续。比如: Range[1-4].CovertCnt=2,现在Update(R[1-2]), 如何处理?

  1. 标记为【无效】,查询时,如果有【无效标记】,则继续往下查。
  2. 干脆直接维护SumLen,出现这种情况,由下往上PushUp更新SumLen即可。

从本质上来讲,两者效果差不多,一个是马上维护SumLen,一个是查询时再计算SumLen。后者省了一次函数调用,和有可能再次被“全区间覆盖”时简化计算,效率能够高一些。所以熟悉哪种就用哪种,切记切记,会10种不如精一种!

Query时需要pushdown吗?

因为查询的是整个区间,不存在“交叉区间”,所以不需要。(当然PushDown【没毛病】,如果没有十足的把握,还是PushDown,反正没有什么副作用。)

Query,当【查询区间】和【更新区间】出现【交叉】的时候,需要PushDown,比如:更新到:[1-2][3-4] 但要查询[2-3] ,则只能由[2]``[3] 两部分构成,所以你必须要从[1-2]PushDown到[2],从[3-4]pushdown到[3]。但如果永远查询都是 [1-N] 的话,就不存在这种情况。

求周长 hdu1828

道理基本上差不多,稍复杂。

  1. 两次扫描,横向和竖向。
  2. 每次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} ) \]

当然也有【一次】扫描的方法,不过需要维护更多的参数,更加复杂一些。一般情况下没有必要。