BZOJ 1007 水平可见直线
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
-1 0
1 0
0 0
Sample Output
HINT
Source
两种做法吧:
- 直接半平面交暴搞,虽然我不会写;
- 第二种主要是针对这个题目的: 利用题所隐藏的性质。稍微YY一下,所能看到的直线沿着X正方向斜率一定是单调递增的。
首先将斜率排序(从小到大)之后一次加入栈中。对于栈顶直线l1,次顶直线l2,以及所枚举到的直线i,如果l与l1的交点在l1与l2交点左方,栈顶的弹出(证明:画画图就知道了)。
最后栈中的直线即为答案。(这个好像就是半平面交)
代码如下:
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std; #define esp (1e-6)
#define maxn 50010
int n,S[maxn],top;
vector <int> vec;
struct Line{double A,B; int ord;}line[maxn]; inline bool cmp(Line a,Line b)
{
if (a.A == b.A) return a.B > b.B;
return a.A < b.A;
} inline double calc(Line a,Line b) {return (double)(b.B-a.B)/(double)(a.A-b.A);} inline bool okay(double a,double b)
{
if (a + esp > b &&a-esp<b) return true;
if (a > b) return true;
return false;
} inline void work()
{
int i;
S[++top] = ; i = ;
while (i <= n&&line[i].A == line[i-].A) i++;
if (i <= n)
{
S[++top] = i; ++i;
while (i <= n&&line[i].A == line[i-].A) i++;
for (;i <= n;++i)
{
if (line[S[top]].A == line[i].A)
continue;
else
{
while (top > && okay(calc(line[S[top]],line[S[top-]]),calc(line[S[top]],line[i])))
--top;
S[++top] = i;
}
}
}
for (i = ;i <= top;++i) vec.push_back(line[S[i]].ord);
sort(vec.begin(),vec.end());
} int main()
{
freopen("1007.in","r",stdin);
freopen("1007.out","w",stdout);
scanf("%d",&n); int i;
for (i = ;i <= n;++i)
{
scanf("%lf %lf",&line[i].A,&line[i].B);
line[i].ord = i;
}
sort(line+,line+n+,cmp);
work();
int nn = vec.size();
for (i = ;i < nn;++i) printf("%d ",vec[i]);
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1007 水平可见直线的更多相关文章
- BZOJ 1007 水平可见直线 | 计算几何
BZOJ 1007 水平可见直线 题面 平面直角坐标系上有一些直线,请求出在纵坐标无限大处能看到哪些直线. 题解 将所有直线按照斜率排序(平行的直线只保留最高的直线),维护一个栈,当当前直线与栈顶直线 ...
- 【BZOJ】1007 水平可见直线
[分析] 维护一个下凸包. 首先依照斜率来从小到大排序. 考虑斜率同样的,肯定仅仅能选截距大的,把截距小的给筛掉. 然后用栈来维护下凸包.先压入前两条直线. 然后对于每一条直线i,设栈中上一条直线p= ...
- 【BZOJ】【1007】【HNOI2008】水平可见直线
计算几何初步 其实是维护一个类似下凸壳的东西?画图后发现其实斜率是单调递增的,交点的横坐标也是单调递增的,所以排序一下搞个单调栈来做就可以了…… 看了hzwer的做法…… /************* ...
- bzoj 1007 [HNOI2008]水平可见直线(单调栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5120 Solved: 1899[Submit][Sta ...
- BZOJ 1007 [HNOI2008]水平可见直线
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4453 Solved: 1636[Submit][Sta ...
- 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...
- BZOJ 1007 [HNOI2008]水平可见直线 (栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7940 Solved: 3030[Submit][Sta ...
- BZOJ 1007: [HNOI2008]水平可见直线 栈/计算几何
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- BZOJ 1007: [HNOI2008]水平可见直线 平面直线
1007: [HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则 ...
随机推荐
- [Redux] Persisting the State to the Local Storage
We will learn how to use store.subscribe() to efficiently persist some of the app’s state to localSt ...
- IOS-AssetsLibrary(相册)框架介绍
AssetsLibrary框架介绍: AssetsLibrary框架包含了ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRep ...
- cocos2d源码剖析
1. TextureAtlas http://www.cocoachina.com/bbs/read.php?tid-311439-keyword-TextureAtlas.html 2. Label ...
- 动态添加子视图 UIView 的正确方法
很多时候哥比较喜欢用代码添加视图,特别是要同时加很多UIView时,而且跟 xib 比起来代码更容易管理,在多人的项目中代码不容易 conflict. 但小牛哥最近发现很多新人都不太清楚正确的使用方法 ...
- json-lib-2.4-jdk15.jar maven
最近自己将一个web项目装换到使用mevan自动管理. 遇到了一个json包导入的问题.最终解决如下: <!-- https://mvnrepository.com/artifact/net.s ...
- Java基础知识强化16:深入分析Java线程中断机制
1.Thread.interrupt真的能中断线程吗? 在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断. ...
- MAC 环境下 初始化新的mysql root 密码
mac 环境下初始化mysql的root密码 关掉mysql服务,打开系统设置最后的mysql,然后将mysql先关掉 生成一个文件命名mysql-init,文件中放入:一句话,这句话不同版本不一样, ...
- c#参数传递使用中的一个坑,值传递与引用传递
c#参数传递使用中发现的一个问题 写了3个重载方法,把 对象.int .(int直接封入object) 传入SWAP方法进行数据操作结果对象内的数据发生了改变,其他2个没有:
- Practice 15.07.07 计算几何 - 1
[题目在这里] A.POJ 2318 叉积判断点在直线的那一侧 cross(X2-X1,P-X1) (x1,x2是直线上两点,p是要判断的点) >0 表示在左侧 <0 表示在右侧 (右手 ...
- EF结合SqlBulkCopy在项目中的使用
这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县Excel数据耗时太长,于是趁这段时间专门研究了 ...