LA3905 Meteor

题意

请参考LRJ白书第一章例题20

思路

扫描线。

这个题分为两部分,首先是要求出每一颗流星划过取景框的时间区间,这一步反而是这个题最复杂的地方,因为要讨论许多种情况,具体的讨论策略可以参考下面的代码。

求出来所有的区间之后,问题转化为选出一条线,使得这条线穿过的区间最多,这里就是扫描线算法派上用场的时候了。其实实现很简单,就是对于每个区间的两个端点,分别创建一个表示起始的事件和一个表示结束的事件,然后把所有事件按照出现的时间排序,接下来从小往大检查,遇到开始事件的时候计数器+1,遇到结束事件的时候计数器-1.

这里有一个问题,如果开始事件和结束事件恰好位于同一时点,怎么办?注意到我们的区间都是开的,这样我们只要优先处理结束事件,就不会导致解偏大了(这里面的逻辑需要自己试着理解一下)。

代码

 

Scroll to top