【BZOJ 1038】[ZJOI2008]瞭望塔
【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1038
【题意】
【题解】
可以看到所有村子的瞭望塔所在的位置只会是在相邻两个村子所代表的点连成的线的半平面交内;
它求的是相对高度;
有个结论是:
最小相对高度差的点,
1.在半平面交的直线的交点处
2.在村子往上的投影处;
平面交用单调队列搞;
搞之前需要先将直线按斜率升序排;
然后就可以想象一下斜率都是0..90°的情形,然后写一些就好;
具体实现看代码;
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1000;
struct point
{
double x,y;
}points[N];
struct line
{
point a,b;
double k,c;
void get()
{
k = (a.y-b.y)/(a.x-b.x);
c = a.y-k*a.x;
}
}lines[N],sta[N];
int n,top = 0;
double ans = 1e12;
void in()
{
rei(n);
rep1(i,1,n)
ref(points[i].x);
rep1(i,1,n)
ref(points[i].y);
}
bool cmp1(line a,line b)//把线段按照斜率升序排
{
return a.k < b.k;
}
point getintersec(line a,line b)//求两条直线的交点
{
point t;
t.x = (a.c-b.c)/(b.k-a.k);
t.y = t.x*a.k+a.c;
return t;
}
void Insert(line t)//插入一条新的平面
//因为都会是往上的,所以处理起来会简单一点吧
{
while (top>=2)
{
if (getintersec(sta[top-1],sta[top]).x>getintersec(sta[top],t).x) top--;
else
break;
}
sta[++top] = t;
}
void halfpaneintersec()//搞平面交
{
rep1(i,1,n-1)
Insert(lines[i]);
}
void pre()
{
rep1(i,1,n-1)
lines[i].a = points[i],lines[i].b = points[i+1],lines[i].get();
sort(lines+1,lines+1+(n-1),cmp1);
halfpaneintersec();
}
double maxh(double x)//村子的投影往上的交点的纵坐标
{
double t = 0;
rep1(i,1,top)
{
double y = sta[i].k*x+sta[i].c;
t = max(t,y);
}
return t;
}
double jdy(double x)//平面交的直线的交点的横坐标往下的投影的交点纵坐标
{
rep1(i,2,n)
{
if (points[i].x>=x)
return points[i].y-(points[i].y-points[i-1].y)*(points[i].x-x)/(points[i].x-points[i-1].x);
}
return 0;
}
void get_ans()
{
rep1(i,1,n)
ans = min(ans,maxh(points[i].x)-points[i].y);
rep1(i,1,top-1)
{
point t = getintersec(sta[i],sta[i+1]);
ans = min(ans,t.y-jdy(t.x));
}
}
void o()
{
printf("%.3f\n",ans);
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
in();
pre();
get_ans();
o();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【BZOJ 1038】[ZJOI2008]瞭望塔的更多相关文章
- bzoj 1038 [ZJOI2008]瞭望塔(半平面交)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...
- BZOJ 1038 ZJOI2008 瞭望塔 半平面交
题目大意及模拟退火题解:见 http://blog.csdn.net/popoqqq/article/details/39340759 这次用半平面交写了一遍--求出半平面交之后.枚举原图和半平面交的 ...
- 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...
- 1038: [ZJOI2008]瞭望塔 - BZOJ
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- 1038: [ZJOI2008]瞭望塔
半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...
- 【BZOJ】1038: [ZJOI2008]瞭望塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意:给出n个x轴各不相同的二维整点,且升序,n<=300,坐标绝对值<=10^6 ...
- bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...
- [BZOJ1038][ZJOI2008]瞭望塔(半平面交)
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2999 Solved: 1227[Submit][Statu ...
- 【BZOJ1038】[ZJOI2008]瞭望塔 半平面交
[BZOJ1038][ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如 ...
随机推荐
- 【Codeforces Round #432 (Div. 2) B】Arpa and an exam about geometry
[链接]h在这里写链接 [题意] 给你3个点A,B,C 问你能不能将纸绕着坐标轴上的一点旋转.使得A与B重合,B与C重合 [题解] 这3个点必须共圆. 则A,B,C不能为一条直线.否则无解. 共圆之后 ...
- COGS——C2274. [HEOI 2016] tree
http://www.cogs.pro/cogs/problem/problem.php?pid=2274 ★☆ 输入文件:heoi2016_tree.in 输出文件:heoi2016_tre ...
- 14. Spring Boot MyBatis 连接数据库
转自:https://blog.csdn.net/catoop/article/details/50553714
- FZU Problem 2156 Climb Stairs DP
http://acm.fzu.edu.cn/problem.php?pid=2156 题目大意: 爬楼梯,要爬到n这个位置,每次可以走x也可以走y,然后一定要经过A和B两点,求最终到达n的方案数. 思 ...
- 第一个Python程序(全面)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.Windows系统 1.编写Python程序方式之Sublime文本编辑器: 1>打开sublime,创建hello.p ...
- Loadrunner--参数化知识点及参数池策略
一.为何进行脚本参数化? 脚本在录制的时候,记录的参数都是常量值,这样,虚拟用户在执行同一个脚本,向服务器发送请求时,使用的都是同一个参数值,与实际不符.所以使用参数化技术. 二.参数化的逻辑? 对脚 ...
- 【Codeforces Round #299 (Div. 2) E】Tavas and Pashmaks
[链接] 我是链接,点我呀:) [题意] 游泳+跑步比赛. 先游泳,然后跑步. 最先到终点的人是winner. 但是现在游泳的距离和跑步的距离长度都不确定. S和R. 给你n个人,告诉你每个人游泳的速 ...
- UVA 10970 - Big Chocolate 洪水@。@
先横着切m-1刀,矩形巧克力就变成了1*n (有m个)然后每个都要切n-1下,所以有 m*(n-1) +(m-1)= n*m-1 #include<cstdio> int main() { ...
- Android内存优化杂谈
Android内存优化是我们性能优化工作中比较重要的一环,这里其实主要包括两方面的工作: 优化RAM,即降低运行时内存.这里的目的是防止程序发生OOM异常,以及降低程序由于内存过大被LMK机制杀死的概 ...
- AForge,Emgu.CV抓拍图像大小
原文:AForge,Emgu.CV抓拍图像大小 2017年,忙忙碌碌地过去了,象往年一样,依然没有时间上CSDN,博客园. 这一年是打工以来最辛苦的一年. 这一年用了不少自己没有接触过的东西.如人脸识 ...