先在一个无穷高的位置画一条线为上界,把左右两端点向上连,形成一个封闭的多边形,求半平面交找到瞭望塔顶可以在的区域。因为点和点都是以直线连接的,斜率固定,所以半平面交到底边距离最近的点一定是某个拐点。那么把得到的集合内的线两两求一下交点,在从左到右依次求半平面交或是底边上的拐点到另一边的距离,找出最小值就可以了。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=310;
struct node{double x,y;
}p1[N],p2[N];
struct edge{node s,t;double x,y;
}l1[N];
struct edge2{double x,y,k,b;
}l2[N];
double ans;
int n,l,r,q1[N],cnt,cnt2;
inline double cross(node a,node b,node c){return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
bool cmp(edge i,edge j){if(atan2(i.y,i.x)!=atan2(j.y,j.x))return atan2(i.y,i.x)<atan2(j.y,j.x);return cross(i.s,i.t,j.t)<0;
}
bool cmp2(node i,node j){return i.x<j.x;
}
inline bool rit(edge a,edge b,edge c){node p;double k1,k2,b1,b2;if(b.x==0)k2=c.y/c.x,b2=c.s.y-k2*c.s.x,p.x=b.s.x,p.y=p.x*k2+b2;else if(c.x==0)k1=b.y/b.x,b1=b.s.y-k1*b.s.x,p.x=c.s.x,p.y=p.x*k1+b1;elsek1=b.y/b.x,k2=c.y/c.x,b1=b.s.y-k1*b.s.x,b2=c.s.y-k2*c.s.x,p.x=(b2-b1)/(k1-k2),p.y=p.x*k1+b1;return cross(a.s,a.t,p)<0;
}
inline void getpt(edge b,edge c){++cnt;double k1,k2,b1,b2;if(b.x==0)k2=c.y/c.x,b2=c.s.y-k2*c.s.x,p2[cnt].x=b.s.x,p2[cnt].y=p2[cnt].x*k2+b2;else if(c.x==0)k1=b.y/b.x,b1=b.s.y-k1*b.s.x,p2[cnt].x=c.s.x,p2[cnt].y=p2[cnt].x*k1+b1;elsek1=b.y/b.x,k2=c.y/c.x,b1=b.s.y-k1*b.s.x,b2=c.s.y-k2*c.s.x,p2[cnt].x=(b2-b1)/(k1-k2),p2[cnt].y=p2[cnt].x*k1+b1;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%lf",&p1[i].x);for(int i=1;i<=n;++i)scanf("%lf",&p1[i].y);for(int i=1;i<n;++i){l1[i].s=p1[i],l1[i].t=p1[i+1],l1[i].x=p1[i+1].x-p1[i].x,l1[i].y=p1[i+1].y-p1[i].y;l2[i].x=p1[i+1].x,l2[i].y=p1[i+1].y,l2[i].k=(l1[i].y/l1[i].x),l2[i].b=l2[i].y-l2[i].k*l2[i].x;}p1[n+1].x=p1[n].x,p1[n+1].y=1e16,p1[n+2].x=p1[1].x,p1[n+2].y=1e16;l1[n].s=p1[n],l1[n].t=p1[n+1],l1[n].x=0,l1[n].y=p1[n+1].y-p1[n].y;l1[n+1].s=p1[n+1],l1[n+1].t=p1[n+2],l1[n+1].x=p1[n+2].x-p1[n+1].x,l1[n+1].y=p1[n+2].y-p1[n+1].y;l1[n+2].s=p1[n+2],l1[n+2].t=p1[1],l1[n+2].x=0,l1[n+2].y=p1[1].y-p1[n+2].y;sort(l1+1,l1+n+3,cmp);q1[1]=1,l=r=1;for(int i=2;i<=n+2;++i){if(atan2(l1[i].y,l1[i].x)==atan2(l1[i-1].y,l1[i-1].x))continue;while(l<r&&rit(l1[i],l1[q1[r]],l1[q1[r-1]]))--r;while(l<r&&rit(l1[i],l1[q1[l]],l1[q1[l+1]]))++l;q1[++r]=i;}while(l<r&&rit(l1[q1[l]],l1[q1[r]],l1[q1[r-1]]))--r;while(l<r&&rit(l1[q1[r]],l1[q1[l]],l1[q1[l+1]]))++l;cnt=0;for(int i=l;i<r;++i)getpt(l1[q1[i]],l1[q1[i+1]]);if(l<r)getpt(l1[q1[l]],l1[q1[r]]);sort(p2+1,p2+cnt+1,cmp2);ans=1e16;cnt2=1;while(l2[cnt2].x<=p2[1].x)++cnt2;for(int i=1;i<=cnt;++i){while(cnt2<n&&p2[i].x>=l2[cnt2].x)ans=min(ans,(p2[i-1].y*(p2[i].x-l2[cnt2].x)+p2[i].y*(l2[cnt2].x-p2[i-1].x))/(p2[i].x-p2[i-1].x)-l2[cnt2].y),++cnt2;ans=min(ans,p2[i].y-(p2[i].x*l2[cnt2].k+l2[cnt2].b));}printf("%.3lf",ans);return 0;
}

[P2600][ZJOI2008]瞭望塔(半平面交)相关推荐

  1. luogu P2600 [ZJOI2008]瞭望塔

    luogu P2600 [ZJOI2008]瞭望塔 大意 题目讲得很清楚啊 题解 可以发现,那个点一定是某两条直线的交点 然后直接枚举两条直线就好了 // luogu-judger-enable-o2 ...

  2. P2600 [ZJOI2008]瞭望塔(半平面交)

    题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ...

  3. [BZOJ 1038][ZJOI 2008]瞭望塔(半平面交)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1038 思路 这个题在上海ACM/ICPC冬令营的比赛中也考过,不是很难,不过想要想到用半平 ...

  4. P2600 [ZJOI2008]瞭望塔

    传送门 暴力也行,退火也行,不是很明白为啥还要用半平面交-- 总之就是把原来的所有限制看成一堆半平面 根据黄学长的博客塔肯定建在转折处最优 //minamoto #include<bits/st ...

  5. bzoj1038 [ZJOI2008]瞭望塔(半平面交)

    bzoj1038 [ZJOI2008]瞭望塔 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意: 村中要建立一个瞭望塔,我们将H ...

  6. 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所 ...

  7. 【BZOJ 1038】 [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec   Memory Limit: 162 MB Submit: 973   Solved: 428 [ Submit][ S ...

  8. bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...

  9. bzoj 1038 [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2438  Solved: 1004 [Submit][Sta ...

最新文章

  1. 使用Python,OpenCV确定对象的颜色
  2. springboot嵌入thymeleaf后css404_SpringBoot2整合Thymeleaf
  3. 2015 2020 r4烧录卡 区别_谁跑赢了沪深300?聪明指数全收益排名 2020-04-10
  4. Spark SQL(五)之数据加载与存储
  5. 数据库导出到excel解决科学计数法问题
  6. ASP.NET 2.0中CSS失效的问题总结
  7. 收藏 | 机器学习中常用的5种回归损失函数
  8. JAVA连接Mysql事例
  9. 8备份sqlserver_关于SQL server 巡检的要点你都知道吗?
  10. 纪念一个曾经的产品(目录)
  11. LeetCode 169. 多数元素 (哈希映射|投票算法)
  12. 知了课堂Day2——微信小程序基础02——wxss
  13. echarts 柱状图设置边框_echarts柱状图
  14. coff2omf matlab,OMF和COFF格式有什么区别?
  15. PPT里面如何插入斜体文字
  16. 【评测】常用免疫细胞培养基
  17. 【DZX修改】根据性别不同显示不同的默认头像
  18. 有关计算机和音乐论文,电脑音乐论文
  19. 使用openssl命令 生成指定有效时间的ssl证书,cer格式
  20. 安装navicat missing required library xxx.dll(libcc.dll libdd.dll)亲测有效

热门文章

  1. 瑞金医院计算机中心副主任朱立峰:从数字化医院到认知医疗
  2. Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  3. JavaScript潜入潜出
  4. CS224N研究热点2_Linear Algebraic Structure of Word Senses, with Applications to Polysemy(对于一词多义的向量表示研究)
  5. ANDROID 背光调节
  6. android 回编译失败,Androidkiller 回编译失败
  7. mysql数据库添加某个IP访问
  8. Qt 之图形(QPainterPath)
  9. JavaWeb仿twitter个人社交网络及微博服务网站
  10. 什么是期权市场的PCR指标?