bzoj1007[HNOI2008]水平可见直线
来源:互联网 发布:qq游戏网络 编辑:程序博客网 时间:2024/05/21 17:32
易水人去,明月如霜。
[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
3
-1 0
1 0
0 0
-1 0
1 0
0 0
Sample Output
1 2
思路:观察题意我们可以发现y=ax+b在无穷大处斜率大的肯定能够被看到,而对于一般的直线,我们发现它如果说它与比他斜率大的直线和它同时和一条直线相交,如果它的交点在比他斜率大的直线的右边,那么它一定会被其他直线覆盖
所以我们可以按斜率从小到大排序后。用一个栈来这样维护。
每次新加一条直线k,设当前栈顶直线为stack[top]=j,栈顶前一条直线为stack[top-1]=i,则若(k,j)的交点在(i,j)交点的左边或重合,则j必是被k与i及之前的直线所完全覆盖的,所以把j pop 出。直到不能再pop为止,再把k加入栈中。
代码:
#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=50000+10;const double esp=1e-9;struct line{int id,k,b;line(int _id=1,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=1;inline int read(){ int x=0,sig=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();} while(isdigit(ch)) x=10*x+ch-'0',ch=getchar(); return x*=sig;}inline void write(int x){ if(x==0){putchar('0');return;}if(x<0) putchar('-'),x=-x; int len=0,buf[15];while(x) buf[len++]=x%10,x/=10; for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;}void init(){ n=read();int x,y; for(int i=1;i<=n;i++){x=read();y=read();L[i]=line(i,x,y);} return;}void work(){ sort(L+1,L+n+1);n=unique(L+1,L+n+1)-L-1; for(int i=1;i<=n;i++){ while(top>2&&getx(S[top-1],S[top-2])>getx(S[top-1],L[i])-esp)top--; S[top++]=L[i]; } for(int i=1;i<top;i++)ans[i]=S[i].id; sort(ans+1,ans+top); return;}void print(){ for(int i=1;i<top;i++)write(ans[i]),PAU; return;}int main(){ init();work();print();return 0;}
0 0
- bzoj1007 [HNOI2008]水平可见直线
- BZOJ1007: [HNOI2008]水平可见直线
- BZOJ1007【HNOI2008】水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线
- bzoj1007【hnoi2008】水平可见直线
- 【HNOI2008】【BZOJ1007】水平可见直线
- BZOJ1007 HNOI2008 水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007[HNOI2008]水平可见直线
- bzoj1007: [HNOI2008]水平可见直线
- BZOJ1007: [HNOI2008]水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007: [HNOI2008]水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007[HNOI2008]水平可见直线
- 【HNOI2008】bzoj1007 水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线
- BZOJ1007 [HNOI2008]水平可见直线
- Dubbo——配置Dubbo的两种方法
- Android摄像头开发:实时摄像头视频预览帧的编码问题(二)
- Tensorflow lesson 5---唯一的运算执行方法Session
- linux学习之Vmware虚拟机怎么挂载windows下的磁盘
- 聊聊Ambari的那些事儿
- bzoj1007[HNOI2008]水平可见直线
- vmware workstation 12安装ubuntu kylin 16.04虚拟机
- rabbitmq 交换模式-Fanout
- Android 控件的显示隐藏上下左右移动动画
- c++作业5
- intel-amt-vulnerability-- memcmp and strncmp function calls can be skipped due to incorrect buffer l
- dd命令测试
- C# Event事件
- 微信小程序的视图容器-- scroll-view