zoukankan      html  css  js  c++  java
  • 【BZOJ 1007】 [HNOI2008]水平可见直线

    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
     
    水平可见直线一定构成一个下凸的半凸包,画画图就能发现,这个下凸包的交点的横坐标单调递增,这样就可以用一个栈来维护
    然后就没有了
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #define eps 1e-8
     6 const int inf=10000000;
     7 using namespace std;
     8 struct node{double a,b;int no;}l[100010];
     9 int n,top,stack[100100];
    10 double x;
    11 bool cmp(node a,node b){
    12     if(fabs(a.a-b.a)<eps)return a.b<b.b;
    13     else return a.a<b.a;
    14 }
    15  
    16 double cal(node a,node b){
    17     return (a.b-b.b)/(b.a-a.a);
    18 }
    19  
    20 bool cmp2(int a,int b){
    21     return l[a].no<l[b].no;
    22 }
    23  
    24 int main(){
    25     scanf("%d",&n);
    26     for(int i=1;i<=n;i++)
    27         scanf("%lf%lf",&l[i].a,&l[i].b),l[i].no=i;
    28     sort(l+1,l+n+1,cmp);
    29     double now=(l[1].b-l[2].b)/(l[2].a-l[1].a);
    30     for(int i=1;i<=n;i++){
    31         while(top){
    32             if(fabs(l[i].a-l[stack[top]].a)<eps) top--;
    33             else if(top>1&&cal(l[i],l[stack[top-1]])<=cal(l[stack[top-1]],l[stack[top]]))
    34                 top--;
    35                 else break;
    36         }
    37         stack[++top]=i;
    38     }
    39     sort(stack+1,stack+1+top,cmp2);
    40     printf("%d",l[stack[1]].no);
    41     for(int i=2;i<=top;i++) printf(" %d",l[stack[i]].no);
    42 }
  • 相关阅读:
    记第一次重装系统
    数值运算_第1周
    更新驱动时显示失败,错误代码56
    Tomcat安装教程及常见错误解决方法
    中国学术界之特点
    Mac 安装qtbingdings出现error 解决方式
    关于xtea加密解密算法
    关于消息认证码
    2、关于协议数据包的设计
    关于协议标识符的实现方法
  • 原文地址:https://www.cnblogs.com/wuminyan/p/5215665.html
Copyright © 2011-2022 走看看