【BZOJ】1007 水平可见直线
【分析】
维护一个下凸包。
首先依照斜率来从小到大排序。
考虑斜率同样的,肯定仅仅能选截距大的,把截距小的给筛掉。
然后用栈来维护下凸包。先压入前两条直线。
然后对于每一条直线i,设栈中上一条直线p=stk[stk[0]]和上上条直线q=stk[stk[0]-1]。
找到i与p的交点m。p与q的交点n。
画三条直线,把n点看成固定的,因为斜率从小到大,要使得上一条直线p看不到。那么m一定在n的左边,即m.x<=n.x。
假设看不到,就退栈,直到在右边。
最后输出,注意可能会存在n=1的情况。这个么,随便处理罢...
PS:网上的代码大多数都是错的,结果还能AC,这道题的数据非常水哟。
【代码】
<span style="font-size:18px;">#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std; const int N=50000;
const double eps=1e-5; struct Line
{
double k,b;
int id;
}line[N],_line[N];
struct Point
{
double x,y;
}now,last;
int n,_n,stk[N]; inline int dc(double i,double j)
{
if (fabs(i-j)<eps) return 0;
return i<j?-1:1;
} int cmp(Line La,Line Lb)
{
int r=dc(La.k,Lb.k);
return r?r<0:dc(La.b,Lb.b)>0;
} inline Point get_point(int i,int j)
{
double k1=_line[i].k,b1=_line[i].b,k2=_line[j].k,b2=_line[j].b; Point P;
P.x=(b2-b1)/(k1-k2);
P.y=(b1*k2-b2*k1)/(k1-k2);
return P;
} inline int cmp1(int i,int j)
{
return _line[i].id<_line[j].id;
} int main(void)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lf%lf",&line[i].k,&line[i].b),line[i].id=i; sort(line+1,line+n+1,cmp);
for (int i=1;i<=n;i++)
{
if (_n&&!dc(line[i].k,_line[_n].k)) continue;
_line[++_n]=line[i];
} stk[++stk[0]]=1,stk[++stk[0]]=2;
for (int i=3;i<=_n;i++)
{
if (stk[0]&&!dc(_line[stk[stk[0]]].k,_line[i].k)) continue;
for (;stk[0]>=2;)
{
last=get_point(stk[stk[0]-1],stk[stk[0]]);
now=get_point(stk[stk[0]],i);
if (last.x>=now.x) stk[stk[0]--]=0; else break;
}
stk[++stk[0]]=i;
} sort(stk+1,stk+stk[0]+1,cmp1);
for (int i=1;i<=stk[0];i++)
{
if (!line[i].id) continue;
printf("%d ",_line[stk[i]].id);
}
printf("\n"); return 0;
}</span>
【BZOJ】1007 水平可见直线的更多相关文章
- BZOJ 1007 水平可见直线 | 计算几何
BZOJ 1007 水平可见直线 题面 平面直角坐标系上有一些直线,请求出在纵坐标无限大处能看到哪些直线. 题解 将所有直线按照斜率排序(平行的直线只保留最高的直线),维护一个栈,当当前直线与栈顶直线 ...
- BZOJ 1007 水平可见直线
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: ...
- 【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为可见的,否则 ...
随机推荐
- SQL注入与xss
1. 什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过递交参数构造巧妙的SQL语句,从而成功获取 ...
- 性能测试之五--webservices接口测试
下面我们进行webservices接口的讲解,包括脚本生成,参数化和关联. 以天气预报的接口为例,接口地址为: http://ws.webxml.com.cn/WebServices/WeatherW ...
- [图论训练]BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路【floyd】
Description 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛.一 张藏宝图上说,如果他的路程上 ...
- mybatis配置报错(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)
如下报错:解决方案:要按照提示的顺序添加属性,(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrappe ...
- idea16使用maven命令clean、编译、打包jar或者war
项目环境:idea16+jdk1.7+maven-3.3.9 项目说明:编写简单的java类,使用maven命令生成jar包,然后执行------->"java -classpath ...
- 商务旅行(codevs 1036)
题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...
- LVM 类型的 Storage Pool
LVM 类型的 Storage Pool 不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用. 不过,LV 由于没有磁盘的 MBR 引导记录,不能 ...
- SQL 随机取出一条数据
今天遇到一需求,需要随机取出一条数据.网上找了下,sqlserver自带的有newID()这个函数,可以随机出来一个guid,用来取随机数还是蛮不错的. 直接上SQL: select top 1 *, ...
- Elixir与编辑器安装
安装 Elixir 每个操作系统的安装说明可以在 elixir-lang.org 网站上 Installing Elixir 部分找到. 安装后你可以很轻松地确认所安装的版本. ~$:elixir - ...
- BZOJ 4034 [HAOI2015]树上操作(树链剖分)
题目链接 BZOJ4034 这道题树链剖分其实就可以了. 单点更新没问题. 相当于更新 [f[x], f[x]]这个区间. f[x]表示树链剖分之后每个点的新的标号. 区间更新的话类似DFS序,求出 ...