【BZOJ】1007: [HNOI2008]水平可见直线(凸包)
题目
传送门:QWQ
分析
在下面维护一个凸壳
好久没写博客了......
代码
#include <bits/stdc++.h> using namespace std; const int maxn=500005; const double eps=1e-15,INF=1e10; struct Line{ double a,b;int n; }l[maxn]; Line st[maxn];int top=0; bool cmp(Line a,Line b){ if(fabs(a.a-b.a)<eps)return a.b<b.b; return a.a<b.a; } bool cmp2(Line a,Line b){ return a.n<b.n; } double cross(Line x,Line y){//交点的x值 return (y.b-x.b)/(x.a-y.a); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf%lf",&l[i].a,&l[i].b); l[i].n=i; } sort(l+1,l+1+n,cmp); for(int i=1;i<=n;i++){ // printf("--- %d\n",top); while((top>1 && cross(st[top-1],st[top])>=cross(st[top-1],l[i]) ) || (top>0 && fabs(st[top].a-l[i].a)<eps)){ top--; } st[++top]=l[i]; } sort(st+1,st+1+top,cmp2); for(int i=1;i<=top;i++) printf("%d ",st[i].n); return 0; }