【BZOJ1007】水平可见直线(HNOI2008)-栈+凸壳
来源:互联网 发布:怎么用万捷网络验证 编辑:程序博客网 时间:2024/06/07 03:02
测试地址:水平可见直线
做法:本题需要用到栈+凸壳。
通过观察,我们知道从
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#define ll long long#define eps 1e-8using namespace std;int n,st[50010],top;bool vis[50010]={0};struct line{ double a,b; int id;}l[50010];struct point{ double x,y;};bool cmp(line a,line b){ return a.a<b.a;}point inter(line i,line j){ point a; a.x=(j.b-i.b)/(i.a-j.a); a.y=i.a*a.x+i.b; return a;}bool check(int i,int j,int k){ point a=inter(l[i],l[j]); if ((l[k].a*a.x+l[k].b)>=a.y) return 1; else return 0;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { l[i].id=i; scanf("%lf%lf",&l[i].a,&l[i].b); } sort(l+1,l+n+1,cmp); top=0; for(int i=1;i<=n;i++) { if (top>0&&fabs(l[st[top]].a-l[i].a)<eps) { if (l[st[top]].b<l[i].b) top--; else continue; } while(top>=2&&check(st[top-1],st[top],i)) top--; st[++top]=i; } for(int i=1;i<=top;i++) vis[l[st[i]].id]=1; for(int i=1;i<=n;i++) if (vis[i]) printf("%d ",i); return 0;}
阅读全文
0 0
- [BZOJ1007][HNOI2008]水平可见直线(栈)
- 【BZOJ1007】水平可见直线(HNOI2008)-栈+凸壳
- 【bzoj1007】[HNOI2008]水平可见直线 单调栈
- 【单调栈】BZOJ1007 [HNOI2008]水平可见直线
- [bzoj1007][HNOI2008]水平可见直线 单调栈
- BZOJ1007 [HNOI2008]水平可见直线 贪心+栈
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- [BZOJ1007][HNOI2008]水平可见直线(单调栈+计算几何)
- [BZOJ1007][HNOI2008]水平可见直线(单调栈)
- [BZOJ1007][HNOI2008]水平可见直线(单调栈+计算几何)
- [bzoj1007][HNOI2008]水平可见直线(单调栈+几何)
- [bzoj1007]:[HNOI2008]水平可见直线(单调栈)
- bzoj1007 [HNOI2008]水平可见直线
- BZOJ1007: [HNOI2008]水平可见直线
- BZOJ1007【HNOI2008】水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线
- bzoj1007【hnoi2008】水平可见直线
- 【HNOI2008】【BZOJ1007】水平可见直线
- 三级缓存模版
- struts2_day02_12-表达式封装_13-比较表达式封装和模型驱动封装
- MapReduce实现矩阵相乘
- Unity菜单运行cmd,例:用explorer.exe打开某个目录
- 数据结构实验之图论八:欧拉回路
- 【BZOJ1007】水平可见直线(HNOI2008)-栈+凸壳
- linux环境下安装PHP中间件ICE(二)
- Filter实现自动用户自动登录功能(三)
- RestTemplate注入
- jQuery教程 8 AJAX
- MySQL之TIMESTAMP
- js DOM添加删除
- Tensorflow版TextCNN主要代码解析
- 实现可以输入多个圆的半径,求面积、周长