当前位置:编程学习 > C/C++ >>

POJ 2932 扫描线思想

这个题确实太神奇了

大意就是给出了n个互不相交的圆。 各个圆之间有可能一个完全包含了另一个。这里包含就是一个圆整个都被另一个圆圈再里面。

现在求那些没有被包含的圆的序号。

数据量是4W

所以N2的肯定不行。

苦思冥想,不得其解

 


看了这个之后不由得大呼数据结构之博大精深

大意就是类似于我们经常用的那种扫描线,只不过这里是圆。

每个圆有最左边的点和最右边的点。我们就是从左到右按顺序把这些点扫一遍。

扫的过程中呢,如果扫到了一个圆的左端点,那么就要看这个圆是否被包含了,如果没被包含,就加入我们设计的数据结构中。那么怎么判断有没有被包含了呢,最裸的想法是看是否被之前数据结构中的圆包含。实际上只需要跟数据结构中跟自己圆心纵坐标相近的上下两个圆来判断即可了,因为此时我们设计的数据结构中一定都是一些互不包含的一些圆,如果新进的这个圆被包含了,那么那个包含它的圆必然在其相邻的地方。

如果扫到了一个圆得右端点呢,就要把这个圆删除掉了,因为再往后的圆不会跟它发生关系了。

根据这个能插入,能删除,能找相邻的条件,可以发现,用set 来实现是再好不过了。

 


 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,