题目:

我是超链接

题解:

很显然,只有瞭望塔和每个山顶形成直线的斜率的绝对值大于对应山坡的斜率,这个山坡才能看见。不难想到对所有的山坡求一个半平面交然后找到有山顶存在的部分,这个n<=300也很小,山坡最多有600,O(n2)O(n^2)求个半平面交吧
一开始还以为瞭望塔只能建在山顶上,突然发现还可以建在山坡上,那么这个最优的点不在【山顶对应的凸包上】就在【凸包的顶点对应的山坡上】
1A

代码:

#include <cstdio>
#include <iostream>
using namespace std;
const double inf=1e11;
const double eps=1e-9;
int dcmp(double x)
{if (x<=eps && x>=-eps) return 0;return (x>0)?1:-1;
}
struct po
{double x,y;po (double X=0,double Y=0){x=X;y=Y;}
}p[1200],d[1200],np[1200];int cnt,ncnt;
po operator +(po x,po y){return po(x.x+y.x,x.y+y.y);}
po operator -(po x,po y){return po(x.x-y.x,x.y-y.y);}
po operator *(po x,double y){return po(x.x*y,x.y*y);}
double cj(po x,po y){return x.x*y.y-x.y*y.x;}
bool have(po a,po b,po c,po d){return dcmp(cj(b-a,c-a))!=dcmp(cj(b-a,d-a));}
po jd(po a,po b,po c,po d){return a+b*(cj(c-a,d)/cj(b,d));}
void init()
{cnt=0;p[++cnt]=po(-inf,-inf);p[++cnt]=po(inf,-inf);p[++cnt]=po(inf,inf);p[++cnt]=po(-inf,inf);
}
void halfp(po a,po b)
{ncnt=0;for (int i=1;i<=cnt;i++){po c=p[i],d=p[i%cnt+1];if (dcmp(cj(b-a,c-a))<=0) np[++ncnt]=c;if (have(a,b,c,d)) np[++ncnt]=jd(a,b-a,c,d-c);}cnt=ncnt;for (int i=1;i<=ncnt;i++) p[i]=np[i];
}
int main()
{int n;scanf("%d",&n);if (n==1) {printf("0.000"); return 0;}for(int i=1;i<=n;i++) scanf("%lf",&d[i].x); for(int i=1;i<=n;i++) scanf("%lf",&d[i].y); init();for (int i=1;i<n;i++) halfp(d[i+1],d[i]);double ans=inf;for (int i=1;i<=n;i++)for (int j=1;j<=cnt;j++)if (p[j].x<=d[i].x && p[j%cnt+1].x>=d[i].x){if (p[j].x==p[j%cnt+1].x) ans=min(ans,min(p[j].y-d[i].y,p[j%cnt+1].y-d[i].y));else{po a=p[j%cnt+1],b=p[j];double k=(a.y-b.y)/(a.x-b.x);double bb=p[j].y-p[j].x*k;double h=k*d[i].x+bb;ans=min(ans,h-d[i].y);}}for (int i=1;i<=cnt;i++)for (int j=1;j<=n;j++)if (d[j].x<=p[i].x && d[j%n+1].x>=p[i].x){if (d[j].x==d[j%n+1].x) ans=min(ans,min(p[i].y-d[j].y,p[i].y-d[j%n+1].y));else{po a=d[j%n+1],b=d[j];double k=(a.y-b.y)/(a.x-b.x);double bb=d[j].y-d[j].x*k;double h=k*p[i].x+bb;ans=min(ans,p[i].y-h);}}printf("%.3lf",ans);
}

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

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

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

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

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

  3. bzoj1038 [ZJOI2008]瞭望塔

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

  4. bzoj1038: [ZJOI2008]瞭望塔

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

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

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

  6. [BZOJ1038]ZJOI2008瞭望塔|半平面交

    考虑某个村庄可以被看见的区域,发现一条线段的上方就是可以看见端点的区域,那就把所有线段扔进去做半平面交,不要忘记了要加上两条左右边界..求出来之后发现答案要么是某个村庄往上到半平面交的一段距离,要么是 ...

  7. bzoj1038 [ZJOI2008]瞭望塔 枚举

    这个题实际上求的是半个凸包的核,但只需要枚举直线两两交点和地上的点就可以很快跑过 根据线性规划原理答案应该在直线交点上,为什么还要看地上的点? 因为实际上可行域是有下限的,有可能下限与地线重合 码(注 ...

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

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

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

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

最新文章

  1. 【问题收录】Eclipse the import java.awt cannot be resolve 问题解决
  2. 新上市Lighthouse专用芯片TS3633规格介绍
  3. 在linux下Qt使用sqlite,QT中SQLite使用【实例】
  4. 老司机又开车(来不及解释,快上!)之秒懂单片机指针!
  5. iOS开发-NULL和nullptr和nil和Nil还有NSNull
  6. 《python核心编程》读书笔记--第15章 正则表达式
  7. System.Web.HttpRequestValidationException——从客户端检测到危险的Request值
  8. ASP.NET Core 项目简单实现身份验证及鉴权
  9. 散列表(二):冲突处理的方法之链地址法的实现
  10. 2017.9.17 kamp 思考记录
  11. 哪一类功率放大电路效率最高_集成电路工艺之双极型工艺
  12. Cockos REAPER 6 for Mac - 强大的数字音频工作站
  13. 电脑计算机人员英语,计算机专业英语词汇新大全(完美打印版).pdf
  14. 小程序 图片上传php后台,微信小程序上传图片到php服务器的方法
  15. (附源码)小程序 口腔诊所预约系统 毕业设计 201738
  16. ddr4单颗粒最大_国产DDR4内存颗粒!南亚DDR4颗粒超频测试
  17. 开源免费 低代码平台开源_行动透明:免费代码营现已开源
  18. asp.net html silverlight 传参数,Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)...
  19. 程序猿的自救 从零备考NSCA/CSCS 1 身体系统的构造与系统
  20. Ubuntu更改用户名

热门文章

  1. 小白日记22:kali渗透测试之提权(二)--抓包嗅探
  2. 马云为何放得下辛苦创立的“阿里帝国”?
  3. 第一章:数字移动通信基础知识
  4. 电大计算机人文英语,电大 人文英语3 翻译 形考题答案教学文案
  5. 对Hive连接metastore数据库的密码进行加密处理
  6. 秘密潜入1-普通枪械射速修改-Python源码
  7. 数据链路层故障排除实例
  8. 乐鑫发布 ESP-IDF v5.0
  9. LaTex制作表格之合并单元格
  10. 张勇卸任,接班人不是蒋凡