1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn=;
  8. const double eps=1e-;
  9. double ans=1e10;
  10. int n,head,tail;
  11. struct vec{
  12. double x,y;
  13. vec(double x=,double y=):x(x),y(y){}
  14. vec operator-(vec& a){
  15. return vec(x-a.x,y-a.y);
  16. }
  17. vec operator+(vec&a){
  18. return vec(x+a.x,y+a.y);
  19. }
  20. }po[maxn],g[maxn];
  21. vec operator*(vec a,double t){return vec(a.x*t,a.y*t);}
  22. double cross(vec a,vec b){return a.x*b.y-b.x*a.y;}
  23. struct lin{
  24. vec p,v;//p是直线上一个点,v是方向向量
  25. double ang;//ang是斜率;
  26. lin(){}
  27. lin(vec p,vec v):p(p),v(v){ang=atan2(v.y,v.x);}
  28. bool operator<(const lin&a)const{
  29. return ang<a.ang;
  30. }
  31. }ll[maxn],q[maxn],bb,cc;
  32. bool onl(lin L,vec p){
  33. return cross(L.v,p-L.p)>;
  34. }
  35. vec qj(lin a,lin b){
  36. vec u=a.p-b.p;
  37. double t=cross(b.v,u)/cross(a.v,b.v);
  38. return a.v*t+a.p;
  39. }
  40. void halfj(){
  41. sort(ll,ll+n);
  42. q[head=tail=]=ll[];
  43. for(int i=;i<n;++i){
  44. while(head<tail&&!onl(ll[i],g[tail-]))tail--;
  45. while(head<tail&&!onl(ll[i],g[head]))head++;
  46. q[++tail]=ll[i];
  47. if(fabs(cross(q[tail].v,q[tail-].v))<eps){
  48. --tail;if(onl(q[tail],ll[i].p))q[tail]=ll[i];
  49. }
  50. if(head<tail)g[tail-]=qj(q[tail-],q[tail]);
  51. }
  52. while(head<tail&&!onl(q[head],g[tail-]))--tail;
  53. }
  54. int main(){
  55. cin>>n;
  56. for(int i=;i<=n;++i){
  57. scanf("%lf",&po[i].x);
  58. }
  59. for(int i=;i<=n;++i){
  60. scanf("%lf",&po[i].y);
  61. }
  62. po[].x=po[].x;po[].y=;
  63. po[n+].x=po[n].x;po[n+].y=;
  64. for(int i=;i<=n;++i){
  65. ll[i]=lin(po[i],po[i+]-po[i]);
  66. }
  67. n+=;
  68. halfj();
  69. for(int k=;k<tail;++k)
  70. for(int i=;i<n-;++i){
  71. vec tmp;tmp.x=g[k].x;tmp.y=-;
  72. if(g[k].x>=po[i].x&&g[k].x<=po[i+].x){
  73. cc=lin(po[i],po[i+]-po[i]);
  74. bb=lin(tmp,g[k]-tmp);
  75. ans=min(ans,g[k].y-qj(cc,bb).y);
  76. }
  77. }
  78. for(int k=;k<=n-;++k)
  79. for(int i=;i<tail-;++i){
  80. vec tmp;tmp.x=po[k].x;tmp.y=-;
  81. if(po[k].x>=g[i].x&&po[k].x<=g[i+].x){
  82. cc=lin(g[i],g[i+]-g[i]);
  83. bb=lin(tmp,po[k]-tmp);
  84. ans=min(ans,qj(cc,bb).y-po[k].y);
  85. }
  86. }
  87. printf("%.3lf",ans);
  88. return ;
  89. }

bzoj1038(半平面交)的更多相关文章

  1. [BZOJ1038][ZJOI2008]瞭望塔(半平面交)

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2999  Solved: 1227[Submit][Statu ...

  2. 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)

    按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...

  3. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 959  Solved: 489[Submit][Status] ...

  4. 【CSU1812】三角形和矩形 【半平面交】

    检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...

  5. 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea

    题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...

  6. poj 3335(半平面交)

    链接:http://poj.org/problem?id=3335     //大牛们常说的测模板题 ------------------------------------------------- ...

  7. poj3525Most Distant Point from the Sea(半平面交)

    链接 求凸多边形内一点距离边最远. 做法:二分+半平面交判定. 二分距离,每次让每条边向内推进d,用半平面交判定一下是否有核. 本想自己写一个向内推进..仔细一看发现自己的平面交模板上自带.. #in ...

  8. poj1474Video Surveillance(半平面交)

    链接 半平面交的模板题,判断有没有核.: 注意一下最后的核可能为一条线,面积也是为0的,但却是有的. #include<iostream> #include <stdio.h> ...

  9. 半平面交模板(O(n*n)&& O(n*log(n))

    摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...

随机推荐

  1. 解决React Native:Error: Cannot find module 'asap/raw'

    本来想做个底部切换的tab的,安装完 npm i react-native-tab-navigator --save 后跑项目就报错了,如下图 和我一样报这个错的朋友们莫慌,一步就可以解决了,执行命令 ...

  2. vue 自定义组件销毁

    今天在开发电商vue前端项目时,用户每次登出再换其它用户登录时,页面显示的用户名和左则导航都还是上个用户的,刚开始以为是localStorage中没有清除全局数据,然后在用户点击退出系统时手动清除lo ...

  3. linux学习笔记:linux常用的命令

    2018-11-19                                      常见命令快速查询一览表 命令 功能 ls 列出目录内容 cat 链接文件并打印到标准输出设备上(通常用来 ...

  4. oracle优化(一)

    非原创 1. 选用合适的ORACLE优化器 ORACLE的优化器有3种: a. RULE(基于规则)b. COST(基于成本) c. CHOOSE(选择性) 选择缺省的优化器,可以通过对init.or ...

  5. python相关注册登录方式

    1.使用django自带功能实现登录/退出登录 使用django自带登录功能,前提生成用户(用户注册)使用的是django自带的user,或称models中用户表继承于django自带的user 1. ...

  6. 面试简单整理之rabbitmq

    135.rabbitmq 的使用场景有哪些? 单反单收,单发多收,发布订阅,按路由发送,按主题发送 136.rabbitmq 有哪些重要的角色? Server,Consumer,Producer 13 ...

  7. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  8. 基于TeamCity的asp.net mvc/core,Vue 持续集成与自动部署

    一 Web Server(Windows)端的配置 1.配置IIS,重要的是管理服务 1.1 配置FTP(前端NPM项目需要) 该步骤略,如果是在阿里云ESC上,需要开启端口21(用来FTP认证握手) ...

  9. JAVA解决前端跨域问题。

    什么是跨域? 通俗来说,跨域按照我自己的想法来理解,是不同的域名之间的访问,就是跨域.不同浏览器,在对js文件进行解析是不同的,浏览器会默认阻止,所以 现在我来说下用java代码解决前端跨域问题. 用 ...

  10. 实验十四 第九组 张燕~杨蓉庆~杨玲 Swing图形界面组件

    实验十四  Swing图形界面组件 8-11-29 理论知识 Swing和MVC设计模式 (1)设计模式(Design pattern)是设计者一种流行的 思考设计问题的方法,是一套被反复使用,多数人 ...