【BZOJ1007】[HNOI2008]水平可见直线

Description

  在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.
例如,对于直线:
L1:y=x; L2:y=-x; L3:y=0
则L1和L2是可见的,L3是被覆盖的.
给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.

Input

  第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi

Output

  从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格

Sample Input

3
-1 0
1 0
0 0

Sample Output

1 2

题解:本人懒,直接用的半平面交。当然由于本题的特殊性质(都是取上半平面),所以我们可以将单调队列换成单调栈。

由于精度问题,本题需要将eps去掉。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=50010;
const double alpha=1.23456789;
struct point
{
double x,y;
point() {}
point(double a,double b){x=a,y=b;}
point operator + (const point &a) const {return point(x+a.x,y+a.y);}
point operator - (const point &a) const {return point(x-a.x,y-a.y);}
point operator * (const double &a) const {return point(x*a,y*a);}
double operator * (const point &a) const {return x*a.y-y*a.x;}
};
struct line
{
point p,v;
double a;
int org;
line() {}
line(point x,point y,int z){p=x,v=y,a=atan2(v.y,v.x),org=z;}
}l[maxn];
int q[maxn],ans[maxn];
int h,t,n;
point getp(line l1,line l2)
{
point u=l1.p-l2.p;
double temp=(l2.v*u)/(l1.v*l2.v);
return l1.p+l1.v*temp;
}
bool onlft(line a,point b)
{
return a.v*(b-a.p)>0;
}
bool cmp(line a,line b)
{
if(fabs(a.a-b.a)==0) return !onlft(a,b.p);
return a.a<b.a;
}
void HPI()
{
sort(l+1,l+n+1,cmp);
int i,cnt;
for(i=2,cnt=1;i<=n;i++) if(fabs(l[i].a-l[cnt].a)>0) l[++cnt]=l[i];
h=t=q[1]=1;
for(i=2;i<=cnt;i++)
{
while(h<t&&!onlft(l[i],getp(l[q[t]],l[q[t-1]]))) t--;
while(h<t&&!onlft(l[i],getp(l[q[h]],l[q[h+1]]))) h++;
q[++t]=i;
}
//while(h<t&&onlft(l[q[h]],getp(l[q[t]],l[q[t-1]]))) t--;
//while(h<t&&onlft(l[q[t]],getp(l[q[h]],l[q[h+1]]))) h++;
}
int main()
{
scanf("%d",&n);
int i;
double a,b;
for(i=1;i<=n;i++) scanf("%lf%lf",&a,&b),l[i]=line(point(0,b),point(1,a),i);
HPI();
for(i=h;i<=t;i++) ans[++ans[0]]=l[q[i]].org;
sort(ans+1,ans+ans[0]+1);
for(i=1;i<=ans[0];i++) printf("%d ",ans[i]);
return 0;
}

【BZOJ1007】[HNOI2008]水平可见直线 半平面交的更多相关文章

  1. bzoj 1007: [HNOI2008]水平可见直线 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=1007; 题解 其实就是求每条直线的上半部分的交 所以做裸半平面交即可 #include ...

  2. [日常摸鱼]bzoj1007[HNOI2008]水平可见直线-半平面交(对偶转凸包)

    不会写半平面交-然后发现可以转成对偶凸包问题 具体见这里:http://trinkle.blog.uoj.ac/blog/235 相关的原理我好像还是不太懂-orz #include<cstdi ...

  3. [bzoj1007][HNOI2008]水平可见直线_单调栈

    水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...

  4. bzoj1007 [HNOI2008]水平可见直线 - 几何 - hzwer.com

    Description Input 第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi Output 从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必 ...

  5. [bzoj1007][HNOI2008][水平可见直线] (斜率不等式)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...

  6. bzoj1007[HNOI2008]水平可见直线

    cycleke神说要用半平面交(其实他也用的凸包),把我吓了一跳,后来发现(看题解)其实可以先按斜率排序,再将最小的两条线入栈,如果其与栈顶元素的交点在上一个点的左边,则将栈顶元素出栈.这是一个开口向 ...

  7. [BZOJ1007] [HNOI2008] 水平可见直线 (凸包)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线:L1:y=x ...

  8. BZOJ1007: [HNOI2008]水平可见直线(单调栈)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8638  Solved: 3327[Submit][Status][Discuss] Descripti ...

  9. BZOJ1007:[HNOI2008]水平可见直线(计算几何)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...

随机推荐

  1. Uncaught SyntaxError: Invalid Unicode escape sequence异常处理

    今天碰到一个问题,页面报错:Uncaught SyntaxError: Invalid Unicode escape sequence ,{index:'operate',name:'operate' ...

  2. python解析json文件报错No JSON object could be decoded

    2017-04-25 可用Nodepad++将json文件打开并以UTF8无BOM格式保存.

  3. iptables 使用场景

    25 Most Frequently Used Linux IPTables Rules Examples by RAMESH NATARAJAN on JUNE 14, 2011 At a firs ...

  4. Matlab中特征向量间距离矩阵的并行mex程序

    在matlab中, 有n个向量(m维)的矩阵Mat(n, m) 要计算任两个向量间的距离, 即距离矩阵, 可使用以下的并行算法以加速: #include <iostream> #inclu ...

  5. vue笔记二

    七.列表渲染 1.示例 <ul id="example-2"> <li v-for="(item, index) in items"> ...

  6. iOS: 学习笔记, 加入一个带界面约束的控制器

    1. 创建一个空iOS应用程序(Empty Application). 2. 加入加控制器类. 改动控制器类的viewDidLoad - (void)viewDidLoad { [super view ...

  7. 使用 mybatis + flying-0.9.4 的电商后端

    代码地址如下:http://www.demodashi.com/demo/12779.html mybatis.flying - 阳春 (Sunny-Spring) 项目介绍请见 flying-doc ...

  8. MongoDB查询条件常用设置

    原文地址:http://blog.csdn.net/mcpang/article/details/8731065 Java操作mongodb进行查询,常用筛选条件的设置如下: 条件列表: BasicD ...

  9. SQLServer 2017安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本

    2016应该也有这个问题 下载JDK7就可以了(我装10是不可以解决的) 重新运行下 安装完后再安装SSMS 附: MS SQL SERVER 2017全套下载地址(含JDK7.SSMS.KEY): ...

  10. WebStorm初次使用

    1. ctrl + / : 单行注释2. ctrl + shift + / : 块注释 3:展开当前函数代码:Ctrl+“+”,收起当前代码:Ctrl+“-” 4:全局查找: Ctrl+Shift+F ...