原题链接:http://codevs.cn/problem/1302/

小矮人

题目描述 Description

矮人们平时有走亲访友的习惯。一天,矮人国要修一条高速公路,矮人们希望他们走亲访友的时候,能够不必穿越高速公路,这样会更安全一些。现在有M个高速公路的修建方案,请你判断这M条高速功能是否能满足矮人们的期望。也就是说给出平面上的N个点(矮人们的住所位置),对于M条直线(高速公路),依次判断这N个点是否在每条直线的同一侧。是输出GOOD,不是输出BAD。

N,M≤100000

输入描述 Input Description

第一行一个整数N,表示矮人的住所数。

接下来N行每行一个坐标代表矮人的住所坐标。

接下来的若干行(到文件结尾)每行4个整数,代表高速公路上的2个点。

所有坐标均在-1e9到1e9之间

输出描述 Output Description

对合法的方案输出GOOD,否则输出BAD。

样例输入 Sample Input

4
0.0 0
6.00 -0.001
3.125 4.747
4.747 0.47
5 3 7 0
4 -4.7 7 4.7
4 47 4 94

样例输出 Sample Output

GOOD
BAD
BAD

题解

首先,如果公路穿过了矮人国,那么直线肯定穿过了凸包,更进一步,该直线肯定穿过凸包的最远点对之间,我们只需要求该直线的最远点对。
显然,夹角最接近且大于该直线夹角的线段起点是一个最远点,而另一个最远点则是该直线夹角取反后,夹角最接近且大于的线段起点。而我们可以很容易的利用求出的凸包的栈中的元素得到一个夹角单调二分查找。

代码
#include<bits/stdc++.h>
#define db double
#define eps 1e-8
using namespace std;
const int M=1e5+5;
const db Pi=acos(db(-1));
const db esp=1e-10;
struct pt{db x,y;};
pt operator +(pt a,pt b){return (pt){a.x+b.x,a.y+b.y};}
pt operator -(pt a,pt b){return (pt){a.x-b.x,a.y-b.y};}
bool operator < (const pt &a,const pt &b){return (a.x==b.x)?(a.y<b.y):(a.x<b.x);}
db operator *(pt a,pt b){return a.x*b.y-a.y*b.x;}
pt operator *(pt a,db b){return (pt){a.x*b,a.y*b};}
pt operator /(pt a,db b){return (pt){a.x/b,a.y/b};}
bool ab(pt a,pt b){return a*b<-eps;}
db area(pt a,pt b,pt c){return abs((b-a)*(c-a)/2.0);}
double dis(pt a,pt b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
pt x[M],sta[M];
db ang[M];
int top;
int n,m;
void tubao()
{sort(x+1,x+n+1);for(int i=1;i<=n;++i){while(top>1&&(sta[top]-sta[top-1])*(x[i]-sta[top-1])<=0) --top;sta[++top]=x[i];}int k=top;for(int i=n-1;i>=1;--i){while(top>k&&(sta[top]-sta[top-1])*(x[i]-sta[top-1])<=0) --top;sta[++top]=x[i];}
}
void in()
{scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%lf%lf",&x[i].x,&x[i].y);
}
db angle(pt hh)
{db v=atan2(hh.y,hh.x);return v<-Pi/2?v+2*Pi:v;
}
int cmp1(db x)
{if(fabs(x)<esp) return 0;return x<0?-1:1;
}
bool cmp2(const db &a,const db &b)
{if(cmp1(b-a)==1) return 1;return 0;
}
bool check(pt a,pt b)
{if(n<=1) return 1;pt u=sta[upper_bound(ang+1,ang+top,angle(b-a),cmp2)-ang];pt v=sta[upper_bound(ang+1,ang+top,angle(a-b),cmp2)-ang];if(cmp1(((b-a)*(u-a))*((b-a)*(v-a)))<eps) return 0;return 1;
}
void ac()
{db a1,a2,b1,b2;for(int i=1;i<top;++i) ang[i]=angle(sta[i+1]-sta[i]);while(scanf("%lf%lf%lf%lf",&a1,&a2,&b1,&b2)==4)check((pt){a1,a2},(pt){b1,b2})?printf("GOOD\n"):printf("BAD\n");
}
int main()
{in();tubao();ac();return 0;
}

Code[VS]1302 小矮人相关推荐

  1. [codevs 1302] 小矮人(2002年CEOI中欧信息学奥赛)

    描述 矮人们平时有走亲访友的习惯.一天,矮人国要修一条高速公路,矮人们希望他们走亲访友的时候,能够不必穿越高速公路,这样会更安全一些.现在有M个高速公路的修建方案,请你判断这M条高速功能是否能满足矮人 ...

  2. 浅析拯救小矮人的 nlogn 算法及其证明

    浅析拯救小矮人的 nlogn 算法及其证明 题型简介: 有 $ n $ 个人,第 $ i $ 个人身高 $ a_i $ 手长 $ b_i $ ,他们为了从一个高为 $ H $ 的洞中出去,决定搭人梯. ...

  3. [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

    2021-09-07 test [TJOI2013]拯救小矮人 「ICPC World Finals 2019」Hobson 的火车 [TJOI2013]拯救小矮人 luogu4823 考试题目的数据 ...

  4. 洛谷 P4823 [TJOI2013]拯救小矮人

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口. 对于每一个小矮人,我们知道他从 ...

  5. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  6. 使用canvas实现小矮人行走案例

    html代码 <canvas width="500" height="500"></canvas> <script src=&qu ...

  7. 项目管理小故事之小矮人的故事

    小矮人的故事 在古希腊时期的塞浦路斯,曾经有一座城堡里关着一群小矮人.传说他们是因为受到了可怕咒语的诅咒,而被关到这个与世隔绝的地方.他们找不到任何人可以求助,没有粮食,没有水,七个小矮人越来越绝 望 ...

  8. 《讲个故事》七个小矮人 与 七层模型

    某天深夜,标准委员会的工程师们的在酒吧里喝酒划拳,酒过三巡,越玩越嗨,谈到迪士尼电影的时候,他们把电影里7个小矮人的名字写在餐巾纸上,有个人开玩笑说 7 对于网络分层是个好数字.第二天上午在标准化委员 ...

  9. 《讲个故事》七个小矮人与OSI七层模型

    某天深夜,标准委员会的工程师们的在酒吧里喝酒划拳,酒过三巡,越玩越嗨,谈到迪士尼电影的时候,他们把电影里7个小矮人的名字写在餐巾纸上,有个人开玩笑说 7 对于网络分层是个好数字.第二天上午在标准化委员 ...

  10. 【BZOJ3174】【codevs25442075】拯救小矮人,DP+贪心

    Time:2016.07.19 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 传送门3 思路: 比较神的DP "贪心确定DP的状态"--reflash 写了 ...

最新文章

  1. Linux终端中设置vi编辑命令
  2. 一个高性能RPC框架原理剖析
  3. BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
  4. java产生的数字发送到页面_JAVA中数字证书的维护及生成方法
  5. 在Java等于方法中进行精确比较
  6. 计算机的概念与发展典型例题,计算机考试基本概念与典型例题.doc
  7. 各种PLC和触摸屏解密软件大全
  8. Linux停服务器命令,使用linux的shutdown命令关闭服务器
  9. spring security 源码解析
  10. Quartz定时任务框架(一)
  11. 极狐GitLab 连接 minikube集群
  12. Mac电脑为什么适合编程?
  13. 渗透测试学习 二、Windows基础
  14. ubuntu20下使用微信开发者工具
  15. JavaScript案例之电影院电子选票
  16. gitlab+Jenkins自动化搭建部署
  17. Shader学习之Cg语言二(Cg数据类型)
  18. 33的挑战状(bilibili首届安全挑战赛)
  19. 输出一个区间内所有的素数(质数)
  20. 最小二乘法直线拟合计算

热门文章

  1. ++递归 字符串全排列_Ann全排列的枚举_递归实现(基于Python)
  2. 八大排序算法-java实现
  3. php对字符串简单加密解密,PHP字符串加密解密
  4. java父类与子类的构造方法,java父类子类构造方法及方法的调用
  5. js-01_面向对象选项卡
  6. 跟小丸子学基础口语16-20
  7. c++ 网络编程课设入门超详细教程 ---目录
  8. 电子商务入门、实操、行业分析及公司案例等精彩系列问答有哪些?
  9. MyCat全局序列之本地时间戳方式
  10. Linux之常用操作命令总结二