BZOJ1007[HNOI2008] 水平可见直线
bzoj链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1007
洛谷链接:https://www.luogu.org/problemnew/show/P3194
水平可见直线
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
题解
其实我觉得洛谷上的那篇讲的巨详细有木有。。。
这道题需要求一群直线中最上面的那几条,我们只需按斜率从小到大排序,开一个栈。每次加入线段时计算一下它与栈顶直线的交点与栈顶直线与栈下面一条直线交点的位置关系,如果加入直线的交点在左边,因为我们按斜率排过序,所以新加入的直线肯定是可以覆盖栈顶直线的,所以栈顶直线退栈。直到栈中直线不满足上述关系式,加入新直线。
细节
注意去掉斜率相同的直线,保留截距最大的就好。
代码
#include<bits/stdc++.h>
using namespace std;
const int M=50005;
struct li{int k,b,id;};
bool operator < (const li &x,const li &y){return (x.k!=y.k)?x.k<y.k:x.b<y.b;}
int n,top,tot;
li line[M],sta[M];
int ans[M];
int sig(double x){return (x>1e-8)-(x<-1e-8);}
double inter(li x,li y)
{int k1,k2,b1,b2;k1=x.k;k2=y.k;b1=x.b;b2=y.b;return 1.0*(b2-b1)/(k1-k2);
}
void in()
{scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d%d",&line[i].k,&line[i].b),line[i].id=i;
}
void ac()
{sort(line+1,line+1+n);tot=n;line[n+1].k=1e9;for(int i=1;i<=n;++i)if(line[i].k==line[i+1].k){line[i].k=1e9;tot--;}sort(line+1,line+1+n);
// for(int i=1;i<=tot;++i)
// printf("%d %d %d\n",line[i].k,line[i].b,line[i].id);for(int i=1;i<=tot;++i){while(top>1&&sig(inter(sta[top],line[i])-inter(sta[top],sta[top-1]))<=0) top--;sta[++top]=line[i];ans[top]=line[i].id;}sort(ans+1,ans+1+top);for(int i=1;i<=top;++i)printf("%d ",ans[i]);
}
int main()
{in();ac();return 0;
}
BZOJ1007[HNOI2008] 水平可见直线相关推荐
- bzoj1007[HNOI2008]水平可见直线
bzoj1007[HNOI2008]水平可见直线 题意: 平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.给出n条直线 ...
- [BZOJ1007] [HNOI2008] 水平可见直线 (凸包)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线:L1:y=x ...
- [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: ...
- BZOJ1007:[HNOI2008]水平可见直线(计算几何)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...
- Bzoj1007 [HNOI2008]水平可见直线
Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6903 Solved: 2643 Description 在xoy直角坐标平面上有n条直线L1,L2 ...
- bzoj 1007: [HNOI2008]水平可见直线
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 7378 Solved: 2829 [Submit][S ...
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...
- BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...
- _bzoj1007 [HNOI2008]水平可见直线【单调栈】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 按斜率排序,去掉斜率相同时,截距较小的直线(即只保留该斜率下截距最大的直线).若当前直 ...
- HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何
题目描述 分析: 直角坐标系内,有n条直线分布,求:最大值(对于任意x,直线上能取到的max( f(x) ))构成的折线由哪些直线构成. Solution : 把直线按照斜率从小到大排序. 从左到右: ...
最新文章
- jQuery中的常用内容总结(一)
- Adaboost算法原理以及matlab代码实现(超详细)
- sleep方法和wait方法的区别
- mongoDB 从单节点迁移到分布式集群 遇到的问题
- Python使用UDP协议实现局域网内屏幕广播
- 新装Windows 2003 + IIS 6.0的问题
- 20191231每日一句
- oracle 取表字段,oracle 取多级的表字段
- 常用和不常用端口一览表
- from scipy.misc import comb ImportError: cannot import name ‘comb‘
- accuary、micro 、macro、weighted F1-score
- 【DirectX学习笔记】02_D3D初始化
- 突破单IP频繁反爬虫限制的小技巧
- php 算生存曲线,生存分析之生存曲线绘制
- 计算机硬盘170gb,假的:《最终幻想15》PC推荐配置GTX1080Ti+170GB硬盘为误传
- 万字长文解读DeepMind与谷歌的AI拉锯战
- UNITY笔技--DOTS/ECS
- win10分辨率不能调整_笔记本电脑如何连接投影仪?MAC OS/Win10/7笔记本和投影仪连接方法...
- Java实现mysql保存微信特殊表情符号
- 硬仗酒全线升级,新概念新玩法新风尚
热门文章
- js map遍历 修改对象里面的值_前端面试之你必须要懂的原生JS
- java注释符_Java程序中的单行注释符是( ),多行注释符是( )。
- vc mysql 连接_vc连接mysql数据库的方法
- python学习笔记之其它
- 如何从数据库(实体提供者)读取安全用户(转自http://wiki.jikexueyuan.com/project/symfony-cookbook/entity-provider.html)...
- Topcoder SRM 144 DIV 1
- 《Android开发卷——HTTP网络通信,HTTP网络连接》
- div+css需要注意的问题
- 【jenkins 异常】org.eclipse.jgit.errors.InvalidObjectIdException: Invalid id xxxxx
- Spring中@Autowired注解的工作原理