BZOJ-1007-水平可见直线-HN2008

描述

在xoy直角坐标平面上有n条直线L1,L2,…Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.
例如,对于直线:
L1:y=x; L2:y=-x; L3:y=0
则L1和L2是可见的,L3是被覆盖的.
给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.


分析

  • 可以用半平面交, 但是看了题解发现可以用栈来做.
  • 先按照斜率从小到大排序, 向栈中添加直线L时, 如果L与栈顶直线的交点的横坐标小于等于栈顶直线和栈中第二条直线的交点横坐标, 就将栈顶元素弹出. 直到不满足这个条件或者栈里只剩下一个元素.
  • 这个可以画图验证
  • 有几个需要注意的地方.

    • 时刻注意栈不要溢出
    • 求交点可以直接用斜截式推出 x = (b2-b1) / (k1-k2)
  • 看来计算几何的题目并不一定是一堆模板一堆函数

  • 书上的方法是普适性的, 但要根据题目来选择.
  • 当然书上的应该掌握…

代码

https://code.csdn.net/snippets/621018

posted @ 2015-03-16 21:20  wfwbz  阅读(108)  评论(0编辑  收藏  举报