[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 \n");
29     else if(n==2){
30         if(V[1].a==V[2].a)printf("1 \n");
31         else printf("1 2 \n");
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("\n");
47     }
48     return 0;
49 }
View Code

 

posted @ 2015-12-19 16:15  Ngshily  阅读(180)  评论(0编辑  收藏  举报