BZOJ 1007 [HNOI2008]水平可见直线
1007: [HNOI2008]水平可见直线
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 4453 Solved: 1636
[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
题解:做的第一道计算几何。。。
要维护的是一个下凸线一样的东西。即从左到右的交点(左)右边的直线是斜率越来越大的。
所以我们可以按斜率从小到大排序后。用一个栈来这样维护。
每次新加一条直线k,设当前栈顶直线为stack[top]=j,栈顶前一条直线为stack[top-1]=i,则若(k,j)的交点在(i,j)交点的左边或重合,则j必是被k与i及之前的直线所完全覆盖的,所以把j pop 出。直到不能再pop为止,再把k加入栈中。
上来忘了unique了,我是个脑残。。。被题目中的任一两线不重合骗了QAQ。。。
还有!!!这种stack一定要写数!组!版!的!
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<queue>
- #include<stack>
- #include<cstring>
- #define PAU putchar(' ')
- #define ENT putchar('\n')
- using namespace std;
- const int maxn=+;const double esp=1e-;
- struct line{int id,k,b;line(int _id=,int _k=0.0,int _b=0.0){id=_id;k=_k;b=_b;}}L[maxn],S[maxn];
- bool operator<(const line&a,const line&b){return (a.k<b.k)||(a.k==b.k&&a.b>b.b);}
- bool operator==(const line&a,const line&b){return a.k==b.k;}
- double getx(line&a,line&b){
- return (double)(b.b-a.b)/(double)(a.k-b.k);
- }
- int n,ans[maxn],top=;
- inline int read(){
- int x=,sig=;char ch=getchar();
- while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
- while(isdigit(ch)) x=*x+ch-'',ch=getchar();
- return x*=sig;
- }
- inline void write(int x){
- if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
- int len=,buf[];while(x) buf[len++]=x%,x/=;
- for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
- }
- void init(){
- n=read();int x,y;
- for(int i=;i<=n;i++){x=read();y=read();L[i]=line(i,x,y);}
- return;
- }
- void work(){
- sort(L+,L+n+);n=unique(L+,L+n+)-L-;
- for(int i=;i<=n;i++){
- while(top>&&getx(S[top-],S[top-])>getx(S[top-],L[i])-esp)top--;
- S[top++]=L[i];
- }
- for(int i=;i<top;i++)ans[i]=S[i].id;
- sort(ans+,ans+top);
- return;
- }
- void print(){
- for(int i=;i<top;i++)write(ans[i]),PAU;
- return;
- }
- int main(){
- init();work();print();return ;
- }
BZOJ 1007 [HNOI2008]水平可见直线的更多相关文章
- bzoj 1007 [HNOI2008]水平可见直线(单调栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5120 Solved: 1899[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为可见的,否则 ...
- bzoj 1007: [HNOI2008]水平可见直线 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=1007; 题解 其实就是求每条直线的上半部分的交 所以做裸半平面交即可 #include ...
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...
- BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...
- BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包
发现需要求一个下凸的半平面上有几个交点. 然后我们把它变成凸包的问题. 好写.好调.还没有精度误差. #include <map> #include <ctime> #incl ...
随机推荐
- AutoBackupForApps
This sample demonstrates how to selectively disable Automatic Backups in Android M, either by adjust ...
- AmazeUI 模态框封装
/** * 模态窗口 */ window.Modal = { tpls:{ alert:'<div class="am-modal am-modal-alert" tabin ...
- chrome浏览的下载扩展程序
C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Extensions 地址栏输入chrome://extensions/并回车打 ...
- C# Wpf集合双向绑定
说明: msdn中 ObservableCollection<T> 类 表示一个动态数据集合,在添加项.移除项或刷新整个列表时,此集合将提供通知. 在许多情况下,所使用的数据是对 ...
- Wpf Binding.Path设置
Binding.Path 获取或设置绑定源属性的路径. 每个绑定通常都具有四个组件:绑定目标对象.目标属性.绑定源,以及要使用的绑定源值的路径.有关这些数据绑定概念的更多信息,请参见数据绑定概述. 使 ...
- Ext4.1 tree grid的右键菜单
Ext4.1 tree grid的右键菜单功能其实挺简单的 只要添加一个itemcontextmenu事件,并在事件中显示出Menu就OK了. 代码: this.tree.on('itemcontex ...
- (转)浅谈dedecms模板引擎工作原理及自定义标签
理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...
- javascript判断值是否undefined
function isUndefined(variable) { return typeof variable == 'undefined' ? true : false; }
- Set Linux starts in multi-user mode as default.
ref: How to start Linux in multiuser mode rather than boot directly into XWindows (X11) steps: Log i ...
- 为什么z-index不起作用
感觉很简单的东西 在用的时候 可能会遇到这样活那样的问题 这就是要注意细节:参考地址:http://www.ourjour.com/136/ 设置z-index 不起作用,可能是这三个原因: 1.父标 ...