【BZOJ1007】【HNOI2008】水平可见直线(斜率排序+单调栈)

时间:2023-02-20 21:18:06

1007: [HNOI2008]水平可见直线

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2605  Solved: 914
[Submit][Status]

Description

【BZOJ1007】【HNOI2008】水平可见直线(斜率排序+单调栈)

Input

第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi

Output

从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格

Sample Input

3
-1 0
1 0
0 0

Sample Output

1 2

HINT

 

Source

分析:本蒟残还是太弱,只能膜拜题解:

以下摘自wyl大神的空间:http://hi.baidu.com/wyl8899/item/061d3b0de2c42b344bc4a362

正解是按斜率排序,用栈维护可见直线。

如右图,当前考虑直线now,栈顶top,栈顶的下一个元素top'大致的位置。

显然now和top'将把top完全遮盖。

思考一下可以得出,记两直线交点的横坐标为x(A,B),则x(now,top)<=x(top,top')时,栈顶直线被废,弹出栈。

反复这样操作,直至不满足上面的条件,将当前直线压入栈中。

最后在栈中的直线就是答案。

对了,同斜率的直线,显然只考虑截距最大的那个就好了,因此要处理一下(当然不处理的话x(now,top)的计算过程中要divided by 0)

总结:一般情况下处理多条直线的问题都是将它们按照斜率排序(我发现很多直线题这一步都是基础),而且之后就能用单调性维护(这个也经常见到,比如斜率优化dp里面就是用单调队列,本题用单调栈)

code:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
struct wjmzbmr
{
int k,b,w;
bool operator < (const wjmzbmr& x) const
{
return (k<x.k)||((k==x.k)&&(b>x.b));
}
}a[maxn+];
wjmzbmr c[maxn+];
int n,stack[maxn+],b[maxn+];
bool f[maxn+];
bool pd(int now,int top,int ltop)
{
double x1=(double)(c[top].b-c[now].b)/(double)(c[now].k-c[top].k);
double x2=(double)(c[top].b-c[ltop].b)/(double)(c[ltop].k-c[top].k);
if(x2-x1>=0.0) return true;else return false;
}
int main()
{
freopen("ce.in","r",stdin);
freopen("ce.out","w",stdout);
scanf("%d",&n);
for(int i=;i<n;++i)
{
scanf("%d%d",&a[i].k,&a[i].b);
a[i].w=i;
c[i]=a[i];
}
sort(a,a+n);
int size=;b[size]=a[].w;
for(int i=;i<n;++i) if(a[i].k!=a[i-].k) b[++size]=a[i].w;
int len=;
memset(stack,,sizeof(stack));
stack[]=b[],stack[]=b[];
for(int i=;i<=size;++i)
{
while(len>=&&pd(b[i],stack[len],stack[len-])) --len;
stack[++len]=b[i];
}
memset(f,,sizeof(f));
for(int i=;i<=len;++i) f[stack[i]]=;
for(int i=;i<n;++i) if(f[i]==) printf("%d ",i+);
return ;
}

【BZOJ1007】【HNOI2008】水平可见直线(斜率排序+单调栈)的更多相关文章

  1. 【bzoj1007】&lbrack;HNOI2008&rsqb;水平可见直线 半平面交&sol;单调栈

    题目描述 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=- ...

  2. BZOJ&period;1007&period;&lbrack;HNOI2008&rsqb;水平可见直线&lpar;凸壳 单调栈&rpar;

    题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...

  3. &lbrack;bzoj1007&rsqb;&lbrack;HNOI2008&rsqb;&lbrack;水平可见直线&rsqb; &lpar;斜率不等式&rpar;

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...

  4. &lbrack;bzoj1007&rsqb;&lbrack;HNOI2008&rsqb;水平可见直线&lowbar;单调栈

    水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...

  5. BZOJ1007&colon; &lbrack;HNOI2008&rsqb;水平可见直线&lpar;单调栈&rpar;

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8638  Solved: 3327[Submit][Status][Discuss] Descripti ...

  6. bzoj1007&colon; &lbrack;HNOI2008&rsqb;水平可见直线 单调栈维护凸壳

    在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3 ...

  7. bzoj1007 &lbrack;HNOI2008&rsqb;水平可见直线——单调栈

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1007 可以把直线按斜率从小到大排序,用单调栈维护,判断新直线与栈顶的交点和栈顶与它之前直线的 ...

  8. BZOJ1007&colon;&lbrack;HNOI2008&rsqb;水平可见直线&lpar;计算几何&rpar;

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...

  9. bzoj1007 &lbrack;HNOI2008&rsqb;水平可见直线 - 几何 - hzwer&period;com

    Description Input 第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi Output 从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必 ...

随机推荐

  1. Java实现事件机制

    java中的事件机制的参与者有3种角色: 1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event sourc ...

  2. &ast;&ast;&ast;CI分页:为CodeIgniter写的分页类

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  3. 浅谈 html- table换行

    这么久都没有来发表点总结了,看了园里的盆友发表的文章中,我发现自己也长进了不少. 但是,最近两天遇见了一个比较棘手的问题,就是在做web页面时,我用了一个table,这个页面是要供手机端调用的,所以在 ...

  4. php设置和获取变量类型

    1. 获取变量类型 gettype($a); 2. 设置变量类型 settype($a,'int'); 3. 测试函数 is_array();是否数组 is_string();是否字符串 is_obj ...

  5. &lbrack;NOI 2009&rsqb;变换序列

    Description 题库链接 对于 \(N\) 个整数 \(0, 1, \cdots, N-1\) ,一个变换序列 \(T\) 可以将 \(i\) 变成 \(T_i\) ,其中 \(T_i \in ...

  6. 转载:Unity3D游戏对象消失enabled、Destroy与active的区别

    转自:http://www.manew.com/3276.html Unity3D游戏对象消失三种方法的区别: gameObject.active:是否在场景中停用该物体,在你gameObject.a ...

  7. opencv学习笔记(九)Mat 访问图像像素的值

    对图像的像素进行访问,可以实现空间增强,反色,大部分图像特效系列都是基于像素操作的.图像容器Mat是一个矩阵的形式,一般情况下是二维的.单通道灰度图一般存放的是<uchar>类型,其数据存 ...

  8. 12&colon; xlrd 处理Excel文件

    1.1 xlrd处理.xlsx 文件 1.xlrd常用方法 #!/usr/bin/python # coding:utf-8 # 用xlrd读取Excel文件基本用法 import sys impor ...

  9. python模块之shutil高级文件操作

    简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 注意即便是更高级别的文件复制函数(shutil.co ...

  10. CentOS7 RPM安装 rabbitmqDownloads on Bintray

    下载 0依赖Erlang RPM for RabbitMQ包(https://github.com/rabbitmq/erlang-rpm) https://dl.bintray.com/rabbit ...