zoukankan      html  css  js  c++  java
  • BZOJ #1007. [HNOI2008]水平可见直线

    比较简单的计算几何题,但是刚开始漏想了一种情况还写了个假算法的说

    容易发现如果我们给所有的直线看成一个向(y=infty)方向的半平面,那么求一个半平面交就可以得到能看到的上方部分的直线了

    由于这里的半平面性质比较好(同开口方向),直接按斜率排序后用单调栈维护一下即可,注意处理好斜率相同的情况

    #include<cstdio>
    #include<algorithm>
    #define RI register int
    #define CI const int&
    using namespace std;
    const int N=50005;
    struct line
    {
    	int k,b,id;
    	friend inline bool operator < (const line& A,const line& B)
    	{
    		return A.k!=B.k?A.k<B.k:A.b>B.b;
    	}
    }l[N]; int n,x,y,stk[N],top,ans[N];
    inline double getx(const line& A,const line& B)
    {
    	if (A.k==B.k) return -1e9; return 1.0*(B.b-A.b)/(A.k-B.k);
    }
    int main()
    {
    	RI i; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d%d",&l[i].k,&l[i].b),l[i].id=i;
    	for (sort(l+1,l+n+1),i=1;i<=n;++i)
    	{
    		if (top&&l[stk[top]].k==l[i].k) continue;
    		while (top>1&&getx(l[stk[top]],l[i])<=getx(l[stk[top]],l[stk[top-1]])) --top;
    		stk[++top]=i;
    	}
    	for (i=1;i<=top;++i) ans[i]=l[stk[i]].id;
    	for (sort(ans+1,ans+top+1),i=1;i<=top;++i) printf("%d ",ans[i]);
    	return 0;
    }
    
    辣鸡老年选手AFO在即
  • 相关阅读:
    Hibernate----面试题
    Java框架部分---面试题
    面试题---多线程
    swap分区
    Linux之格式化与挂载
    Linux下的GPT分区
    Linux下的MBR分区
    vim基础初步
    管道符,通配符以及其他特殊符号
    shell基础之脚本执行,命令别名以及快捷键等
  • 原文地址:https://www.cnblogs.com/cjjsb/p/13894762.html
Copyright © 2011-2022 走看看