bzoj 1038 瞭望塔 半平面交+分段函数
题目大意
给你一座山,山的形状在二维平面上为折线
给出\((x_1,y_1),(x_2,y_2)...(x_n,y_n)\)表示山的边界点或转折点
现在要在\([x_1,x_n]\)(闭区间)中选择一个点中建立瞭望塔
要求瞭望塔能看到山的任意一个地方
求满足条件的瞭望塔最矮能多矮
样例如图

分析
对于一个山坡,它能被看到,当且仅当在瞭望塔在山坡对应的直线上方
可以理解为半平面交
也可以像\(~\) 水平可见直线 \(~\)那样理解
由于建的区间还有要限制在\([x_1,x_n]\)
我们额外加两个半平面
搞出来图如下

其实发现跟\(~\) 水平可见直线\(~\) 差不多,求出来的半平面交是一个下凸壳
我们假如要在x的位置建瞭望塔
瞭望塔塔底固定了,那么我们就要式瞭望塔塔顶最矮
那一定是在半平面交中\(x\)对应的值
可以发现,这tm就是个分段的一次函数,分段的位置在山转折处/半平面交转折处
对于每段,函数的极点在最左或最右(这不是显然的吗?我怎么想了10分钟?)
枚举一下就好了(如果数据大的话好像要二分找)
做法
求f(x)可以用斜率
之前直线的向量存法P+tv中v向量的斜率=原函数斜率
solution
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef double db;
const db INF=1e30;
const int M=307;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
struct pt{
db x,y;
pt(db xx=0.0, db yy=0.0){x=xx;y=yy;}
}p[M];
pt operator +(pt x,pt y){return pt(x.x+y.x,x.y+y.y);}
pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
pt operator *(pt x,db d){return pt(x.x*d,x.y*d);}
pt operator /(pt x,db d){return pt(x.x/d,x.y/d);}
db dot(pt x,pt y){return x.x*y.x+x.y*y.y;}
db det(pt x,pt y){return x.x*y.y-x.y*y.x;}
db len(pt x){return sqrt(dot(x,x));}
db dis(pt x,pt y){return len(y-x);}
db area(pt x,pt y,pt z){return det(y-x,z-x);}
struct line{
pt P,v;
line(pt PP=pt(),pt vv=pt()){P=PP;v=vv;}
}l[M],s[M];
bool lineleft(line x,line y){
db tp=det(x.v,y.v);
return tp>0||((tp==0)&&det(x.v,y.P-x.P)>0);
}
bool ptright(pt x,line y){return det(y.v,x-y.P)<=0;}
bool parallel(line x,line y){return det(x.v,y.v)==0;}
pt inter(line x,line y){
pt u=x.P-y.P;
db t=det(u,y.v)/det(y.v,x.v);
return x.P+x.v*t;
}
int n,m,top;
bool cmp(line x,line y){
if(x.v.y==0 && y.v.y==0) return x.v.x<y.v.x;
if(x.v.y<=0 && y.v.y<=0) return lineleft(x,y);
if(x.v.y>0 && y.v.y>0) return lineleft(x,y);
return x.v.y<y.v.y;
}
void hpi(){
sort(l+1,l+m+1,cmp);
top=0;
for(int i=1;i<=m;i++){
while(top>1&&ptright(inter(s[top-1],s[top]),l[i])) top--;
s[++top]=l[i];
}
}
db calc1(pt x){
for(int i=1;i<top;i++)
if(inter(s[i],s[i+1]).x>=x.x)
return (s[i].P.y+s[i].v.y/s[i].v.x*(x.x-s[i].P.x))-x.y;
}
db calc2(pt x){
for(int i=2;i<=n;i++)
if(p[i].x>=x.x)
return x.y-(p[i-1].y+(p[i].y-p[i-1].y)/(p[i].x-p[i-1].x)*(x.x-p[i-1].x));
}
int main(){
int i;
n=rd();
for(i=1;i<=n;i++) p[i].x=rd();
for(i=1;i<=n;i++) p[i].y=rd();
for(i=2;i<=n;i++) l[++m]=line(p[i-1],p[i]-p[i-1]);
l[++m]=line(p[1].x,pt(0,-1));
l[++m]=line(p[n].x,pt(0,1));
hpi();
db ans=INF;
for(i=1;i<=n;i++)
ans=min(ans,calc1(p[i]));
for(i=1;i<top;i++)
ans=min(ans,calc2(inter(s[i],s[i+1])));
printf("%.3lf\n",ans);
return 0;
}
bzoj 1038 瞭望塔 半平面交+分段函数的更多相关文章
- [BZOJ1038][ZJOI2008]瞭望塔(半平面交)
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2999 Solved: 1227[Submit][Statu ...
- BZOJ 1038 瞭望塔
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- 「BZOJ1038」「洛谷P2600」「ZJOI2008」瞭望塔 半平面交+贪心
题目链接 BZOJ/洛谷 题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示: 我们可以用一条山的上方 ...
- bzoj 3190 [JLOI2013]赛车 半平面交+细节处理
题目大意 这里有一场赛车比赛正在进行,赛场上一共有N辆车,分别称为g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行 ...
- bzoj 2618: [Cqoi2006]凸多边形 [半平面交]
2618: [Cqoi2006]凸多边形 半平面交 注意一开始多边形边界不要太大... #include <iostream> #include <cstdio> #inclu ...
- [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...
- 再来一道测半平面交模板题 Poj1279 Art Gallery
地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- 三道半平面交测模板题 Poj1474 Poj 3335 Poj 3130
求半平面交的算法是zzy大神的排序增量法. ///Poj 1474 #include <cmath> #include <algorithm> #include <cst ...
- bzoj 1038 [ZJOI2008]瞭望塔(半平面交)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...
随机推荐
- Elastic Search Java Api 创建索引结构,添加索引
创建TCP客户端 Client client = new TransportClient() .addTransportAddress(new InetSocketTransportAddress( ...
- python之函数的初识
1. 面向过程编程的缺点 代码重复 代码可可读性不高 2. 函数的定义*** 函数是以功能为导向,一个函数封装一个功能.登录,注册,文件的改的操 3.函数的作用*** 函数减少代码的重复性,增 ...
- axios的post请求方法---以Vue示例
Axios向后端提交数据的参数格式是json,而并非用的是form传参,post表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使 ...
- Dojo的dojoConfig函数
在我们引入 Dojo 的时候都会先做一些全局的配置,所使用的就是 Dojo 的 Config 接口. dojoConfig为以前的dgConfig函数. <script type="t ...
- 03_4_this关键字
03_4_this关键字 1. this关键字 在类的方法定义中使用的this关键字代表使用该方法的对象的引用. 当必须指出当前使用方法的对象是谁时要使用this. 有时使用this可以处理方法中成员 ...
- Spring XML配置文件无法自动提示 eclipse中XML配置文件open with打开方式选择 XML Editor:注意它的编辑方式也是有两种的design和source
双击XML配置文件,如果打开方式不正确 则如下图: 都是灰色显示,不会有自动提示,也不会有颜色标注 右击XML配置文件,选择打开方式为XML Editor,则会有颜色标注 如果此时没有自动提示 则要手 ...
- (2) html 语义化
HTML语义化标签 1 什么是语义化标签? 通过标签判断内容语义,例如根据h1标签判断出内容是标题,根据 p 判断内容是段落.input 标签是输入框等. 2 为什么要标签语义化? 1.搜素引擎友好 ...
- 【主席树 启发式合并】bzoj3123: [Sdoi2013]森林
小细节磕磕碰碰浪费了半个多小时的时间 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M ...
- LeetCode之Weekly Contest 101
前一段时间比较忙,而且做这个对于我来说挺耗时间的,已经间隔了几期的没做总结了,后面有机会补齐.而且本来做这个的目的就是为了防止长时间不做把编程拉下,不在追求独立作出所有题了.以后完赛后稍微尝试下,做不 ...
- MySQL写delete语句时不支持表别名
今天写代码时发现了下面一个比较奇怪的问题: 有下面的删除数据的SQL ; 这个sql本来没有问题,但是在MySQL中执行时会报错 ; 原因是 MySQL写delete语句时不支持表别名,困扰了我一会儿 ...