zoukankan      html  css  js  c++  java
  • BZOJ 1007 HNOI2008 水平可见直线 半平面交

    题目大意:给定n条直线,求从上到下俯瞰能看到哪些直线

    半平面交的裸题

    首先将全部直线依照斜率排序。依次入栈

    假设一条直线和栈顶的交点在栈顶直线和栈顶以下那条直线的交点的左側,则删除栈顶

    若多条直线斜率同样,仅仅插入截距最大的那条直线

    最后记录答案输出就可以

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define M 50500
    using namespace std;
    typedef pair<double,double> point;
    struct line{
    	double k,b;
    	int pos;
    	bool operator < (const line &y) const
    	{
    		if( fabs(k-y.k) < 1e-7 )
    			return b < y.b;
    		return k < y.k;
    	}
    }lines[M];
    int n,top;
    line *stack[M];
    bool ans[M];
    point Cross(const line &l1,const line &l2)
    {
    	double x=(l1.b-l2.b)/(l2.k-l1.k);
    	double y=l1.k*x+l1.b;
    	return point(x,y);
    }
    void Insert(line &l)
    {
    	while(top>1)
    	{
    		point p1=Cross(l,*stack[top]);
    		point p2=Cross(*stack[top],*stack[top-1]);
    		if( p1.first-p2.first<1e-7 )
    			stack[top--]=0x0;
    		else
    			break;
    	}
    	stack[++top]=&l;
    }
    int main()
    {
    	int i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    		scanf("%lf%lf",&lines[i].k,&lines[i].b),lines[i].pos=i;
    	sort(lines+1,lines+n+1);
    	for(i=1;i<=n;i++)
    		if( i==n || fabs(lines[i].k-lines[i+1].k)>1e-7 )
    			Insert(lines[i]);
    	while(top)
    		ans[stack[top--]->pos]=1;
    	for(i=1;i<=n;i++)
    		if(ans[i])
    			printf("%d ",i);
    }
    


  • 相关阅读:
    正则表达式
    jdbc,链接调用数据库的方法——例题
    python字符串操作
    python条件判断
    python运算符
    python中输入输出
    python关键字与标识符
    python变量
    python注释
    安装django报错一直安装不上?
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5282430.html
Copyright © 2011-2022 走看看