Description

在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条直线两两不重合.求出所有可见的直线.

Input

第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi

Output

从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格

Sample Input

3
-1 0
1 0
0 0

Sample Output

1 2

Solution

首先把直线按照斜率排序,再用个栈维护一下。

画个图可以发现,如果直线$i$和直线$stack[top]$的交点在直线$stack[top-1]$的左边,那么$stack[top]$就可以被弹出了。随便判判就好了。

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define N (50009)
 6 #define INF (1e18)
 7 using namespace std;
 8
 9 struct Vector
10 {
11     double x,y;
12     Vector(double xx=0,double yy=0)
13     {
14         x=xx; y=yy;
15     }
16 }p[N];
17 typedef Vector Point;
18
19 struct Line
20 {
21     double k,b;
22     Point x,y;
23     int id;
24     bool operator < (const Line &a) const
25     {
26         return k==a.k?b>a.b:k>a.k;
27     }
28     bool operator == (const Line &a) const
29     {
30         return k==a.k && b==a.b;
31     }
32 }L[N],stack[N];
33
34 int n,k,b,ans[N],top;
35
36 double Cross(Vector a,Vector b) {return a.x*b.y-a.y*b.x;}
37 Vector operator - (Vector a,Vector b) {return Vector(a.x-b.x,a.y-b.y);}
38
39 inline int read()
40 {
41     int x=0,w=1; char c=getchar();
42     while (!isdigit(c)) {if (c=='-') w=-1; c=getchar();}
43     while (isdigit(c)) x=x*10+c-'0', c=getchar();
44     return x*w;
45 }
46
47 Point Line_Cross(Line u,Line v)
48 {
49     Point ans;
50     ans.x=(v.b-u.b)/(u.k-v.k);
51     ans.y=u.k*ans.x+u.b;
52     return ans;
53 }
54
55 int main()
56 {
57     n=read();
58     for (int i=1; i<=n; ++i)
59     {
60         k=read(); b=read();
61         L[i]=(Line){k,b};
62         L[i].x=(Point){0,b};
63         L[i].y=(Point){1,k+b};
64         L[i].id=i;
65     }
66     sort(L+1,L+n+1);
67     for (int i=1; i<=n; ++i)
68     {
69         if (top && L[i].k==stack[top].k) continue;
70         while (top>=2)
71         {
72             Point p=Line_Cross(stack[top],L[i]);
73             if (Cross(stack[top-1].x-p,stack[top-1].y-p)>0) break;
74             top--;
75         }
76         stack[++top]=L[i];
77     }
78     for (int i=1; i<=top; ++i) ans[stack[i].id]=1;
79     for (int i=1; i<=n; ++i) if (ans[i]) printf("%d ",i);
80 }

转载于:https://www.cnblogs.com/refun/p/10454843.html

BZOJ1007:[HNOI2008]水平可见直线(计算几何)相关推荐

  1. bzoj1007[HNOI2008]水平可见直线

    bzoj1007[HNOI2008]水平可见直线 题意: 平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.给出n条直线 ...

  2. [BZOJ1007] [HNOI2008] 水平可见直线 (凸包)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线:L1:y=x ...

  3. bzoj 1007 : [HNOI2008]水平可见直线 计算几何

    题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...

  4. [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.     例如,对于直线:   ...

  5. HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何

    题目描述 分析: 直角坐标系内,有n条直线分布,求:最大值(对于任意x,直线上能取到的max( f(x) ))构成的折线由哪些直线构成. Solution : 把直线按照斜率从小到大排序. 从左到右: ...

  6. Bzoj1007 [HNOI2008]水平可见直线

    Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 6903  Solved: 2643 Description 在xoy直角坐标平面上有n条直线L1,L2 ...

  7. bzoj 1007: [HNOI2008]水平可见直线

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7378  Solved: 2829 [Submit][S ...

  8. BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)

    题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...

  9. _bzoj1007 [HNOI2008]水平可见直线【单调栈】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 按斜率排序,去掉斜率相同时,截距较小的直线(即只保留该斜率下截距最大的直线).若当前直 ...

最新文章

  1. WebClient UI和Tomcat的启动器
  2. 阿里巴巴Java开发规约的IDEA插件使用
  3. phpstudy升级5.7
  4. Electron通过ffi调用DLL
  5. 单例嵌套 ios_嵌套类型的前5个用例
  6. 【工作感悟】全网最经典26道Spring面试题总结
  7. 多维度创新打造领先阿里云技术生态
  8. windows终止进程——taskkill
  9. REST和RESTful详解到实战
  10. UI设计需要学习什么软件?
  11. JS中的map()和forEach()有什么区别?
  12. Android 关于IC卡的读写和加密
  13. 普通键盘Windows上虚拟Cherry机械键盘效果的方法
  14. JAVA安卓植物大战僵尸主题四子棋游戏
  15. 老板让全体员工《致加西亚的信》
  16. python 生成诸如A001 A002 ... A100这样的序列
  17. Hybrid接口、MSTP协议
  18. alsa 麦克风采集音频
  19. 不要996!程序员创建955.WLB不加班公司名单,GitHub周榜第二
  20. 服务器里怎么给网站刷排名,细数刷排名软件的原理与实现过程

热门文章

  1. tapable 创建钩子
  2. useState使用和原理
  3. 1.两数之和-LeetCode
  4. java初始块,java初始代码块
  5. 华为鸿蒙内测报名要报吗,华为鸿蒙HarmonyOS 2.0公测版/内测版申请和招募指南,快来报名尝鲜吧!...
  6. python的全局变量 local variable ‘xxx‘ referenced before assignment
  7. 福一中招聘计算机教师,2017福建福州一中招聘拟聘公示
  8. ubuntu php 错误,Ubuntu下如何开启PHP错误提示教程
  9. 对接海外faceid
  10. Linux上安装集群版Redis