BZOJ 1007 HNOI 2008 水平可见直线 计算几何+栈
题目大意:给出一些笛卡尔系中的一些直线,问从(0,+∞)向下看时能看到哪些直线。
思路:半平面交可做,可是显然用不上。
类似于求凸包的思想,维护一个栈。
先将全部直线依照k值排序。然后挨个压进去,遇到有前一个交点被挡住的话就先弹栈。
比較闹心的是去重。我的方法是压栈之前先去重,然后在处理。
CODE:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 50010
#define EPS 1e-5
using namespace std; inline bool dcmp(double a,double b); struct Point{
double x,y; Point(double _ = 0,double __ = 0):x(_),y(__) {}
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);
}
};
struct Line{
double k,b;
int _id; bool operator <(const Line &a)const {
if(dcmp(k,a.k)) return b < a.b;
return k < a.k;
}
}line[MAX],_line[MAX]; int lines;
int top;
Line *stack[MAX];
Point intersection[MAX]; bool ans[MAX]; inline Point GetIntersection(const Line &l1,const Line &l2);
inline bool Under(const Line &l,const Point &p); int main()
{
cin >> lines;
for(int i = 1;i <= lines; ++i) {
scanf("%lf%lf",&line[i].k,&line[i].b);
line[i]._id = i;
}
sort(line + 1,line + lines + 1);
int cnt = 0;
for(int i = 1;i <= lines; ++i) {
if(dcmp(line[i].k,line[i + 1].k)) continue;
_line[++cnt] = line[i];
}
stack[++top] = &_line[1];
stack[++top] = &_line[2];
intersection[top - 1] = GetIntersection(_line[1],_line[2]);
for(int i = 3;i <= cnt; ++i) {
if(i != cnt && _line[i].k == _line[i + 1].k) continue;
while(top > 1 && Under(_line[i],intersection[top - 1])) --top;
stack[++top] = &_line[i];
intersection[top - 1] = GetIntersection(*stack[top],*stack[top - 1]);
}
for(int i = 1;i <= top; ++i)
ans[stack[i]->_id] = true;
for(int i = 1;i <= lines; ++i)
if(ans[i]) printf("%d ",i);
return 0;
} inline bool dcmp(double a,double b)
{
return fabs(a - b) < EPS;
} inline Point GetIntersection(const Line &l1,const Line &l2)
{
Point re;
re.x = (l2.b - l1.b) / (l1.k - l2.k);
re.y = re.x * l1.k + l1.b;
return re;
} inline bool Under(const Line &l,const Point &p)
{
if(l.k * p.x + l.b > p.y || dcmp(l.k * p.x + l.b,p.y)) return true;
return false;
}
BZOJ 1007 HNOI 2008 水平可见直线 计算几何+栈的更多相关文章
- 【BZOJ 1007】 [HNOI2008]水平可见直线
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: ...
- 【BZOJ 1007】 [HNOI2008]水平可见直线
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 [题意] [题解] 这个人讲得很好 http://blog.csdn.net/o ...
- BZOJ 1007 水平可见直线 | 计算几何
BZOJ 1007 水平可见直线 题面 平面直角坐标系上有一些直线,请求出在纵坐标无限大处能看到哪些直线. 题解 将所有直线按照斜率排序(平行的直线只保留最高的直线),维护一个栈,当当前直线与栈顶直线 ...
- bzoj1007 [HNOI2008]水平可见直线——单调栈
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1007 可以把直线按斜率从小到大排序,用单调栈维护,判断新直线与栈顶的交点和栈顶与它之前直线的 ...
- BZOJ1007: [HNOI2008]水平可见直线(单调栈)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8638 Solved: 3327[Submit][Status][Discuss] Descripti ...
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...
- BZOJ 1007 [HNOI2008]水平可见直线 ——计算几何
用了trinkle的方法,半平面交转凸包. 写了一发,既没有精度误差,也很好写. #include <map> #include <ctime> #include <cm ...
- BZOJ1007:[HNOI2008]水平可见直线(计算几何)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...
- [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...
随机推荐
- HIToj--1076--Ordered Fractions(水题)
Ordered Fractions Source : Unknown Time limit : 3 sec Memory limit : 32 M Submitted : 1510, Ac ...
- 异步Ajax
Ajax异步刷新应用在Web开发中经常用到,在过去WebForm中通常是使用JQuery和一般处理程序或者aspx页面来实现: 在MVC中,虽然依然可以使用一般处理程序,但是一般还是通过在Contro ...
- JSP页面的静态包含和动态包含的区别与联系
JSP中有两种包含: 静态包含:<%@include file="被包含页面"%> 动态包含:<jsp:include page="被包含页面" ...
- Hexo页面优化和音乐的心得
灵感 这两天在添加“留言”以及“关于”页面,准备先简单设计一下自已的页面.留言页面可以放置一些自已比较感兴趣的音乐.以及一些JS特效,再集成一个第三方的留言功能.关于页面可以放置一些简单的联系方式.以 ...
- 学习——HTML5中事件
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
- 【Henu ACM Round#18 C】Ilya and Sticks
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用cnt[i]记录数字i出现的次数就好. 然后i从1e6逆序到1 如果cnt[i+1]和cnt[i]>0同时成立的话. 那么得 ...
- 【Android实战】Android沉浸式状态栏实现(下)
之前的Android沉浸式状态栏实现并没有考虑软键盘的影响,接下来的内容将会针对这个问题给出解决方式,先看一下效果图 这个是一个留言板的效果图: 即弹出软键盘的时候并不会导致整个布局上移. 详细怎样实 ...
- IsoAlgo3d三维管道软件
IsoAlgo3d三维管道软件 eryar@163.com 1.概述 IsoAlgo3d三维管道软件主要用于将目前国际主流管道设计软件AVEVA PDMS和Intergraph SmartPlatn3 ...
- 84.friend友元类
#include <iostream> using namespace std; //友元函数的主要作用就是访问私有变量 class myclass { public: friend cl ...
- POJ 2455 二分+网络流
题意: 思路: 莫名其妙TLE 啊woc我A了一坨题的网络流模板有问题 !!!! 在常数上会慢 (一个等于号 啊啊啊) 改了所有网络流有关的文章- .... //By SiriusRen #inclu ...