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 @ 2016-02-01 16:18  lcchuguo  阅读(168)  评论(0编辑  收藏  举报