BZOJ_1007_ [HNOI2008]_水平可见直线_(单调栈+凸包)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1007
给出一些直线,沿着y轴从上往下看,能看到多少条直线.
分析
由于直线相交,会遮挡住一些直线.
自己画画图就可以发现,最后能看见的直线,也就是在最上面的那些直线一定构成一个凸包的下凸壳(没错一定是凸的).
接下来就是如何求这个下凸壳了.
先按照斜率为第一关键字,截距为第二关键字,将直线从小到大排序.用一个斜率单调递增的栈来维护凸壳.
我们按照排序后的顺序添加直线,画画图会发现:
1.斜率相同的直线,截距小的会被覆盖.
2.如果第i条直线之前有>=2条直线,那么第i条直线与第(i-1)条直线的交点p,第(i-1)条直线与第(i-2)条直线的交点q,有这样的关系:
(1).如果p在q右边,那么第i条直线可以直接加进来.
(2).如果p在q左边或者p与q重合,那么第(i-1)条直线会被第i条直线覆盖.
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn=+;
- const double eps=1e-;
- int n,top;
- int s[maxn];
- bool mark[maxn];
- struct line{
- double k,b;
- int id;
- bool operator < (const line &a) const{
- if(fabs(a.k-k)<eps) return b<a.b;
- return k<a.k;
- }
- }l[maxn];
- inline double crossx(line x,line y){ return (x.b-y.b)/(y.k-x.k); }
- void insert(int x){
- while(top){
- if(fabs(l[x].k-l[s[top]].k)<eps) top--;
- else if(top>&&crossx(l[x],l[s[top]])<=crossx(l[s[top]],l[s[top-]])) top--;
- else break;
- }
- s[++top]=x;
- }
- void init(){
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%lf%lf",&l[i].k,&l[i].b), l[i].id=i;
- sort(l+,l+n+);
- }
- int main(){
- init();
- for(int i=;i<=n;i++) insert(i);
- for(int i=;i<=top;i++) mark[l[s[i]].id]=true;
- for(int i=;i<=n;i++)if(mark[i]) printf("%d ",i);
- return ;
- }
1007: [HNOI2008]水平可见直线
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 5631 Solved: 2138
[Submit][Status][Discuss]
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
BZOJ_1007_ [HNOI2008]_水平可见直线_(单调栈+凸包)的更多相关文章
- 【BZOJ1007】【HNOI2008】水平可见直线 几何 单调栈
题目大意 给你\(n\)条直线\(y=kx+b\),问你从\(y\)值为正无穷大处往下看能看到那些直线. \(1\leq n\leq 500000\) 题解 如果对于两条直线\(l_i,l_j\),\ ...
- 【BZOJ1007】水平可见直线(单调栈)
[BZOJ1007]水平可见直线(单调栈) 题解 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的 ...
- bzoj 1007 [HNOI2008]水平可见直线(单调栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5120 Solved: 1899[Submit][Sta ...
- 【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)
题目链接 把线段以斜率为第一关键字,截距为第二关键字升序排序. 然后维护一个单调栈,保证栈中两两线段的交点的\(x\)坐标单调上升就行了.栈中的线段即为所求. #include <cstdio& ...
- _bzoj1007 [HNOI2008]水平可见直线【单调栈】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 按斜率排序,去掉斜率相同时,截距较小的直线(即只保留该斜率下截距最大的直线).若当前直 ...
- [bzoj1007][HNOI2008]水平可见直线_单调栈
水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...
- 【BZOJ1007】【HNOI2008】水平可见直线(斜率排序+单调栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2605 Solved: 914[Submit][Stat ...
- 【BZOJ】【1007】【HNOI2008】水平可见直线
计算几何初步 其实是维护一个类似下凸壳的东西?画图后发现其实斜率是单调递增的,交点的横坐标也是单调递增的,所以排序一下搞个单调栈来做就可以了…… 看了hzwer的做法…… /************* ...
- 【BZOJ1007】【HNOI2008】水平可见直线
依旧看黄学长代码,不过这回是看完后自己写的 原题: 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例 ...
随机推荐
- java新手笔记25 日期格式化
1.系统时间 package com.yfs.javase; import java.sql.Time; import java.sql.Timestamp; import java.util.Cal ...
- Java编程思想读书笔记--第21章并发
1.基本的线程机制 定义任务 public class LiftOff implements Runnable{ protected int countDown = 10; private stati ...
- Makefile当中宏定义传递字符串
前几天遇到类似的问题[http://bbs.chinaunix.net/thread-1589386-1-1.html]: 在Makefile里面定义一个字符串在程序里面使用, CFLAGS += - ...
- 模板:函数memcpy
函数原型 void *memcpy(void *dest, const void *src, size_t n); 2功能 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地 ...
- 顺序表 C++模板实现
#include <iostream> using namespace std; template <typename T> class list{ private: int ...
- RX学习笔记:JavaScript数组操作
RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...
- Oracle 自连接 / 外连接 / 子查询
--连接查询的三种格式 select ename, deptno,dname from emp natural join dept; select ename, deptno,dname from e ...
- JavaScript 判断用户输入的邮箱及手机格式是否正确
JavaScript判断用户输入的邮箱格式是否正确.判断用户输入的手机号格式是否正确,下面有个不错的示例,感兴趣的朋友可以参考下. 复制代码代码如下: /* * 功能:判断用户输入的邮箱格式是否正确 ...
- tp数据表字段缓存
在维护一个tp写的项目,因为需要在产品表product中增加了一个字段status,但是不论如何就是无法给status赋值,查了资料才发现,原来是tp的数据表字段缓存在搞鬼. 在runtime> ...
- FireMonkey消息机制
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, FMX.Forms, FMX.Plat ...