BZOJ 1038 瞭望塔
Description
致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安。我们将H村抽象为一维的轮廓。如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), (x2, y2), …. (xn, yn)来描述H村的形状,这里x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]间的任意位置, 但必须满足从瞭望塔的顶端可以看到H村的任意位置。可见在不同的位置建造瞭望塔,所需要建造的高度是不同的。为了节省开支,dadzhi村长希望建造的塔高度尽可能小。请你写一个程序,帮助dadzhi村长计算塔的最小高度。
Input
第一行包含一个整数n,表示轮廓折线的节点数目。接下来第一行n个整数, 为x1 ~ xn. 第三行n个整数,为y1 ~ yn。
Output
仅包含一个实数,为塔的最小高度,精确到小数点后三位。
Sample Input
6
1 2 4 5 6 7
1 2 2 4 2 1
【输入样例二】
4
10 20 49 59
0 10 10 0
Sample Output
1.000
【输出样例二】
14.500
HINT
对于100%的数据, N ≤ 300,输入坐标绝对值不超过106,注意考虑实数误差带来的问题。
Source
半平面交。对于每条线段,所能看到其整条线段的点一定的在其所延长直线的上方,因此我们可以对所以直线求一次半平面交。
然后,最优解一定在线段端点处或半平面交所得多边形的顶点处。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; #define eps (1e-6)
#define oo ((double)(1ll<<50))
#define maxn 310
int n,m,tot,cnt;
double ans = oo;
struct NODE
{
double x,y;
friend inline NODE operator + (const NODE &p,const NODE &q) { return (NODE) {p.x+q.x,p.y+q.y}; }
friend inline NODE operator - (const NODE &p,const NODE &q) { return (NODE) {p.x-q.x,p.y-q.y}; }
friend inline NODE operator * (const NODE &p,const double &q) { return (NODE) {p.x*q,p.y*q}; }
friend inline double operator /(const NODE &p,const NODE &q) { return p.x*q.y-p.y*q.x; }
inline double alpha() { return atan2(y,x); }
}mou[maxn],pol[maxn],pp[maxn];
struct LINE
{
NODE p,v; double slop;
inline void maintain() { slop = v.alpha(); }
friend inline bool operator <(const LINE &l1,const LINE &l2) { return l1.slop < l2.slop; }
}lines[maxn],qq[maxn];
struct SCAN
{
double x,y; int id; bool sign;
friend inline bool operator <(const SCAN &a,const SCAN &b)
{
if (a.x != b.x) return a.x < b.x;
else return a.sign < b.sign;
}
}bac[maxn]; inline bool ol(const LINE &l,const NODE &p) { return l.v/(p-l.p) > ; } inline NODE cp(const LINE &a,const LINE &b)
{
NODE u = a.p - b.p;
double t = (b.v/u)/(a.v/b.v);
return a.p+a.v*t;
} inline bool para(const LINE &a,const LINE &b)
{
return fabs(a.v/b.v) < eps;
} inline void ready()
{
for (int i = ;i < n;++i)
{
lines[++tot] = (LINE) {mou[i],(mou[i+]-mou[i])*1e-};
lines[tot].maintain();
}
lines[++tot] = (LINE) {(NODE) {-oo,},(NODE){,-0.001}};
lines[tot].maintain(); lines[++tot] = (LINE) {(NODE) {,oo},(NODE){-0.001,}};
lines[tot].maintain(); lines[++tot] = (LINE) {(NODE) {oo,},(NODE){,0.001}};
lines[tot].maintain(); lines[++tot] = (LINE) {(NODE) {,-oo},(NODE){0.001,}};
lines[tot].maintain();
} inline int half_plane_intersection()
{
sort(lines+,lines+tot+);
int head,tail;
qq[head = tail = ] = lines[];
for (int i = ;i <= tot;++i)
{
while (head < tail&&!ol(lines[i],pp[tail-])) --tail;
while (head < tail&&!ol(lines[i],pp[head])) ++head;
qq[++tail] = lines[i];
if (para(qq[tail],qq[tail-]))
{
tail--;
if (ol(qq[tail],lines[i].p)) qq[tail] = lines[i];
}
if (head < tail) pp[tail-] = cp(qq[tail],qq[tail-]);
}
while (head < tail && !ol(qq[head],pp[tail-])) --tail;
if (tail-head <= ) return ;
pp[tail] = cp(qq[tail],qq[head]);
for (int i = head;i <= tail;++i) pol[++m] = pp[i];
pol[] = pol[m];
return m;
} inline void work()
{
int all = ;
for (int i = ;i <= n;++i)
bac[++all] = (SCAN) { mou[i].x,mou[i].y,i,false };
for (int i = ;i <= m;++i)
if (pol[i].x >= mou[].x&&pol[i].x <= mou[n].x)
bac[++all] = (SCAN) { pol[i].x,pol[i].y,i,true };
sort(bac+,bac+all+);
int s1,s2;
for (int i = ;i <= all;++i) if (bac[i].sign) { s1 = bac[i].id-; break; }
for (int i = ;i <= all;++i)
{
LINE l = (LINE) {(NODE) {bac[i].x,},(NODE) {,}},l1; NODE p;
if (!bac[i].sign)
{
l1= (LINE) {pol[s1],pol[s1+]-pol[s1]};
s2 = bac[i].id;
}
else
{
l1= (LINE) {mou[s2],mou[s2+]-mou[s2]};
s1 = bac[i].id;
}
p = cp(l,l1);
ans = min(ans,fabs(p.y-bac[i].y));
}
} int main()
{
freopen("1038.in","r",stdin);
freopen("1038.out","w",stdout);
scanf("%d ",&n);
for (int i = ;i <= n;++i) scanf("%lf",&mou[i].x);
for (int i = ;i <= n;++i) scanf("%lf",&mou[i].y);
ready();
half_plane_intersection();
work();
printf("%.3lf",ans);
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1038 瞭望塔的更多相关文章
- bzoj 1038 瞭望塔 半平面交+分段函数
题目大意 给你一座山,山的形状在二维平面上为折线 给出\((x_1,y_1),(x_2,y_2)...(x_n,y_n)\)表示山的边界点或转折点 现在要在\([x_1,x_n]\)(闭区间)中选择一 ...
- 【BZOJ】【1038】【ZJOI2008】瞭望塔
计算几何/半平面交 说是半平面交,实际上只是维护了个下凸壳而已……同1007水平可见直线 对于每条线段,能看到这条线段的点都在这条线段的“上方”,那么对所有n-1条线段求一个可视区域的交,就是求一个半 ...
- 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...
- 【BZOJ 1038】[ZJOI2008]瞭望塔
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] [题解] 可以看到所有村子的瞭望塔所在的位置只会是在相邻两个村子所代表 ...
- 1038: [ZJOI2008]瞭望塔 - BZOJ
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...
- 1038: [ZJOI2008]瞭望塔
半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...
- 「BZOJ1038」「洛谷P2600」「ZJOI2008」瞭望塔 半平面交+贪心
题目链接 BZOJ/洛谷 题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示: 我们可以用一条山的上方 ...
- [BZOJ1038][ZJOI2008]瞭望塔(半平面交)
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2999 Solved: 1227[Submit][Statu ...
随机推荐
- 【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]
今天写下php中,如何通过各种方法 获取当前系统时间.时间戳,并备注各种格式的含义,可灵活变通.1.获取当前时间方法date()很简单,这就是获取时间的方法,格式为:date($format, $ti ...
- Android 官方文档:(二)应用清单 —— 2.2 <action>标签
syntax: <action android:name="string" /> contained in: <intent-filter> descrip ...
- MFC——error LNK2005: "protected: static struct AFX_MSGMAP
好久没弄VC程序了,今天弄了下,还会用公司给的窗口重绘作为基类来实现,竟然报了这个错误. 找了一下是这里: 有个窗口重绘类是基类: class CBaseDlg : public CDialog 新建 ...
- db4o官方停止支持及面向对象数据库的一些感想
前一段时间试用了db4o,真心认为不错.但自己在国内搜索了一下,并没有找到不论什么一个专门的论坛和面向对象的数据库产品.深感这东西在国内并没有太普及. 但自己试用认为这个东东真心不错(当然也有自己的优 ...
- [React] React Fundamentals: with-addons - ReactLink
It can be tedious to type out all the boilerplate needed to get the DOM and states in React to synch ...
- eclipse删除空行
1.打开源码编辑器 2.使用快捷键Ctrl+f 3.在Find输入框中输入:^\s*\n 4.Replace With输入框的值为空 5.在[Options]选中的"Regular expr ...
- 用PHP实现一个高效安全的ftp服务器(一)
摘要: 本文主要阐述使用PHP的swoole扩展实现ftp服务器,同时扩展ftp服务器个性化功能和安全性.真正实现一个自己完全掌控的ftp服务器,可以个性化定制的ftp服务器. 正文: FTP服务器想 ...
- Javascript实现Web颜色值转换
最近一直忙碌于完成业务需求,好长时间没有写博客了.今天稍微有些时间,翻看了一下最近项目中的一些前端代码,看到Web颜色转换功能的时候,突然想到当我们在做一些颜色设置/编辑的需求时,经常会涉及到各种颜色 ...
- iOS_ruby环境的配置
AC机中安装RUBY环境 转自:http://www.cnblogs.com/foxting/p/4520829.html 在安装CocoaPods之前要先配置好RUBY环境,本文就怎么安装RUBY ...
- Tomcat设置最佳线程数总结
最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...