【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
来源:互联网 发布:机构交易内部软件 编辑:程序博客网 时间:2024/06/05 14:26
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
Sample Output
1 2
题解:先按斜率排序,将最小的两条线入栈,然后依次处理每条线,如果其与栈顶元素的交点在上一个点的左边,则将栈顶元素出栈 ;对任意一个开口向上的半凸包,从左到右依次观察,发现其斜率不断增大,顶点的横坐标也不断增大。本题可用于理解dp优化中的维护上/下凸壳。
代码如下:
#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ll long long#define inf 0x7f7f7f7f#define eps 1e-8using namespace std;int n,top;struct line{ double a,b; int id;}l[50005],stc[50005];bool vis[50005];int cmp(line a,line b){ if(fabs(a.a-b.a)<eps) return a.b<b.b; return a.a<b.a;}double jie(line a,line b){return (b.b-a.b)/(a.a-b.a);}void insert(line x){ while(top) { if(fabs(stc[top].a-x.a)<eps) top--; else if(top>1 && jie(x,stc[top-1])<=jie(stc[top],stc[top-1])) top--; else break; } stc[++top]=x;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf%lf",&l[i].a,&l[i].b); l[i].id=i; } sort(l+1,l+1+n,cmp); for(int i=1;i<=n;i++) insert(l[i]); for(int i=1;i<=top;i++) vis[stc[i].id]=1; for(int i=1;i<=n;i++) if(vis[i]) printf("%d ",i); printf("\n"); return 0;}
0 0
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- [BZOJ1007][HNOI2008]水平可见直线(单调栈+计算几何)
- [BZOJ1007][HNOI2008]水平可见直线(单调栈+计算几何)
- [BZOJ1007]HNOI2008水平可见直线|计算几何|栈
- 【计算几何】[HNOI2008][HYSBZ/BZOJ1007]水平可见直线
- 【几何】[HNOI2008][BZOJ1007]水平可见直线
- [bzoj1007][HNOI2008]水平可见直线(单调栈+几何)
- [BZOJ1007][HNOI2008]水平可见直线(栈)
- 【BZOJ1007】水平可见直线(HNOI2008)-栈+凸壳
- bzoj1007 [HNOI2008]水平可见直线
- BZOJ1007: [HNOI2008]水平可见直线
- BZOJ1007【HNOI2008】水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线
- bzoj1007【hnoi2008】水平可见直线
- 【HNOI2008】【BZOJ1007】水平可见直线
- BZOJ1007 HNOI2008 水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007[HNOI2008]水平可见直线
- UML(一) 类图详解
- js中height、clientHeight、scrollHeight、offsetHeight区别
- Collections(集合的工具类)
- UNIX常用命令行指令(5)(访问权限和进程操作)
- 基数排序
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- Linux常用命令
- C语言--计算程序执行时间
- Arrays(数组的工具类)
- IIS7 运行Thinkphp,支持rewrite
- javascript打开新窗口的几种方式
- Typescript 2+迷你书 :从入门到不放弃
- kaldi 1d-CNN网络结构
- linux驱动开发之开篇