【BZOJ 1007】[HNOI2008]水平可见直线 半平面交

来源:互联网 发布:mac word转pdf原页面 编辑:程序博客网 时间:2024/05/16 17:11

裸半平面交

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#define maxn 50021using namespace std;int n,ans[maxn],cnt;struct Line{double k,b;int id;bool operator<(const Line& y)const{return k==y.k ? b>y.b : k<y.k;}}l[maxn],q[maxn];struct P{double x,y;P(double a=0,double b=0):x(a),y(b){}};P Q(Line a,Line b){double k1=a.k,k2=b.k,b1=a.b,b2=b.b;double x=(b1-b2)/(k2-k1);double y=k1*x+b1;return P(x,y);}bool judge(Line a,Line b,Line t){P x=Q(a,t);return x.x*b.k+b.b<=x.y;}void solve(){q[1]=l[1],q[2]=l[2];int L=1,R=2;for(int i=3;i<=cnt;i++){while(L<R&&judge(q[R-1],q[R],l[i]))R--;while(L<R&&judge(q[L],q[L+1],l[i]))L++;q[++R]=l[i];}for(int i=L;i<=R;i++){ans[q[i].id]=1;}}int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lf%lf",&l[i].k,&l[i].b),l[i].id=i;sort(l+1,l+1+n);for(int i=1;i<=n;i++){if(l[i].k!=l[i-1].k||i==1)l[++cnt]=l[i];}solve();for(int i=1;i<=n;i++)if(ans[i])printf("%d ",i);return 0;}


0 0
原创粉丝点击