zoukankan      html  css  js  c++  java
  • [BZOJ1007]水平可见直线

      发现其实是一个下凸壳,所以先按斜率排序,然后判断当前直线与栈顶直线的交点是否更靠右

      注意平行的情况

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define maxn 50005
     5 #define esp 1e-8
     6 struct node{
     7     double a,b;
     8     int id;
     9 }V[maxn];
    10 double a[maxn],b[maxn];
    11 int sta[maxn],top;
    12 bool fail(int x){
    13     int l1=sta[top-1],l2=sta[top];
    14     return (b[l2]-b[x])/(a[x]-a[l2])<=(b[l2]-b[l1])/(a[l1]-a[l2]);
    15 }
    16 bool cmp(node x,node y){
    17     if(fabs(x.a-y.a)<esp)return x.b<y.b;
    18     else return x.a<y.a;
    19 }
    20 int main(){
    21     int n;
    22     scanf("%d",&n);
    23     for(int i=1;i<=n;i++){
    24         scanf("%lf%lf",&a[i],&b[i]);
    25         V[i]=(node){a[i],b[i],i};
    26     }
    27     sort(V+1,V+1+n,cmp);
    28     if(n==1)printf("1 
    ");
    29     else if(n==2){
    30         if(V[1].a==V[2].a)printf("1 
    ");
    31         else printf("1 2 
    ");
    32     }
    33     else{
    34         for(int i=1;i<=n;i++){
    35             int yo=V[i].id;
    36             while(top){
    37                 if(fabs(a[sta[top]]-a[yo])<esp)top--;
    38                 else if(top>1&&fail(yo))top--;
    39                 else break;
    40             }
    41             sta[++top]=yo;
    42         }
    43         sort(sta+1,sta+1+top);
    44         for(int i=1;i<=top;i++)
    45             printf("%d ",sta[i]);
    46         printf("
    ");
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    20150316--TP-01
    20150314--TP-02
    20150314--TP-01
    20150313+微信-全
    表单/iframe与video标签
    图像/超链接标签
    HTML列表与表格
    JAVA新的一天
    MySQL常用函数
    php基础--来自网页转载
  • 原文地址:https://www.cnblogs.com/Ngshily/p/5059308.html
Copyright © 2011-2022 走看看