您的位置:首页 > 其它

[BZOJ1007]水平可见直线

2015-12-19 16:15 344 查看
  发现其实是一个下凸壳,所以先按斜率排序,然后判断当前直线与栈顶直线的交点是否更靠右

  注意平行的情况

#include<bits/stdc++.h>
using namespace std;

#define maxn 50005
#define esp 1e-8
struct node{
double a,b;
int id;
}V[maxn];
double a[maxn],b[maxn];
int sta[maxn],top;
bool fail(int x){
int l1=sta[top-1],l2=sta[top];
return (b[l2]-b[x])/(a[x]-a[l2])<=(b[l2]-b[l1])/(a[l1]-a[l2]);
}
bool cmp(node x,node y){
if(fabs(x.a-y.a)<esp)return x.b<y.b;
else return x.a<y.a;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf",&a[i],&b[i]);
V[i]=(node){a[i],b[i],i};
}
sort(V+1,V+1+n,cmp);
if(n==1)printf("1 \n");
else if(n==2){
if(V[1].a==V[2].a)printf("1 \n");
else printf("1 2 \n");
}
else{
for(int i=1;i<=n;i++){
int yo=V[i].id;
while(top){
if(fabs(a[sta[top]]-a[yo])<esp)top--;
else if(top>1&&fail(yo))top--;
else break;
}
sta[++top]=yo;
}
sort(sta+1,sta+1+top);
for(int i=1;i<=top;i++)
printf("%d ",sta[i]);
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: