[BZOJ1007]水平可见直线
2015-12-19 16:15
344 查看
发现其实是一个下凸壳,所以先按斜率排序,然后判断当前直线与栈顶直线的交点是否更靠右
注意平行的情况
View Code
注意平行的情况
#include<bits/stdc++.h> using namespace std; #define maxn 50005 #define esp 1e-8 struct node{ double a,b; int id; }V[maxn]; double a[maxn],b[maxn]; int sta[maxn],top; bool fail(int x){ int l1=sta[top-1],l2=sta[top]; return (b[l2]-b[x])/(a[x]-a[l2])<=(b[l2]-b[l1])/(a[l1]-a[l2]); } bool cmp(node x,node y){ if(fabs(x.a-y.a)<esp)return x.b<y.b; else return x.a<y.a; } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf%lf",&a[i],&b[i]); V[i]=(node){a[i],b[i],i}; } sort(V+1,V+1+n,cmp); if(n==1)printf("1 \n"); else if(n==2){ if(V[1].a==V[2].a)printf("1 \n"); else printf("1 2 \n"); } else{ for(int i=1;i<=n;i++){ int yo=V[i].id; while(top){ if(fabs(a[sta[top]]-a[yo])<esp)top--; else if(top>1&&fail(yo))top--; else break; } sta[++top]=yo; } sort(sta+1,sta+1+top); for(int i=1;i<=top;i++) printf("%d ",sta[i]); printf("\n"); } return 0; }
View Code
相关文章推荐
- Arduino - IIC SCANNER
- 【iOS学习笔记 15-12-19】自定义cell侧滑按钮(UIButton)
- 性能测试知多少----性能测试分类之我见
- 性能测试知多少---性能需求分析
- ubuntu14.04安装hadoop2.6.03
- 为线程池中的每个线程设置UncaughtExceptionHandler
- CAGradientLayer实现颜色渐变
- Java应用发布后,需要关注的7个性能指标
- C语言编写静态链接库及其使用
- android的线程安全
- js获取本机操作系统类型的两种方法
- 1、初步接触python
- Redis数据结构(一)
- [BZOJ1597] [Usaco2008 Mar]土地购买
- 检查邮箱合法性
- Java中的反射——(1)什么是反射
- MySQL分区总结
- 性能测试知多少---了解前端性能
- 性能测试知多少---响应时间
- Ruby安装