【题目链接】: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]瞭望塔的更多相关文章

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...

  2. BZOJ 1038 ZJOI2008 瞭望塔 半平面交

    题目大意及模拟退火题解:见 http://blog.csdn.net/popoqqq/article/details/39340759 这次用半平面交写了一遍--求出半平面交之后.枚举原图和半平面交的 ...

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

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

  4. 1038: [ZJOI2008]瞭望塔 - BZOJ

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

  5. 1038: [ZJOI2008]瞭望塔

    半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意:给出n个x轴各不相同的二维整点,且升序,n<=300,坐标绝对值<=10^6 ...

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

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

  8. [BZOJ1038][ZJOI2008]瞭望塔(半平面交)

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2999  Solved: 1227[Submit][Statu ...

  9. 【BZOJ1038】[ZJOI2008]瞭望塔 半平面交

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

随机推荐

  1. Mongodb总结6-数据库启动、停止、备份等命令

    #启动Mongodb默认启动,需要在/data/db,Windows下对应的目录是Mongod.exe所在磁盘分区的根目录,例如Mongodb存放在D:/Mongodb,那么对应的路径就是D:/dat ...

  2. 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2< ...

  3. Python写爬虫-爬甘农大学校新闻

    Python写网络爬虫(一) 关于Python: 学过C. 学过C++. 最后还是学Java来吃饭. 一直在Java的小世界里混迹. 有句话说: "Life is short, you ne ...

  4. 【AtCoder Beginner Contest 074 C】Sugar Water

    [链接]h在这里写链接 [题意] 让你在杯子里加糖或加水. (4种操作类型) 糖或水之间有一定关系. 糖和水的总量也有限制. 问你糖水浓度的最大时,糖和糖水的量. [题解] 写个dfs就好. 每次有4 ...

  5. 【Android工具类】验证码倒计时帮助类CountDownButtonHelper的实现

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 我们在做有关短信验证码功能的时候.为了防止用户无休止的获取短信验证码,或者是误操作.造成验证码混乱的情况.我 ...

  6. Qt的一些开发技巧

    Lambda匿名函数 有时候槽函数代码辑逻辑非常简单,可以直接用下面的Lambda匿名函数处理信号,简捷明了.需c++11支持,不支持自身递归调用. 1 2 3 4 5 6 7 QComboBox * ...

  7. 15、USB摄像头图片采集+QT显示

    一.Qt的下载和的安装 关于Qt的安装,网络上有很详细的介绍.这里只做简单介绍. 需要的安装包一共有两个:Qt Creator 和QTE. 1)QT Creator 下载地址:qt-sdk-linux ...

  8. JAVA Concurrent包 中的并发集合类

    我们平时写程序需要经常用到集合类,比如ArrayList.HashMap等,但是这些集合不能够实现并发运行机制,这样在服务器上运行时就会非常的消耗资源和浪费时间,并且对这些集合进行迭代的过程中不能进行 ...

  9. 最小生成树(MST)求解旅行商问题

    从当前位置开始(也可以不指定起始位置),访问完所有未访问的端点后返回起始点的最短路径就是连接所有端点的生成树.最小生成树需保证: 每条边最多只能被选 1 次: 抹掉所有未被选择的边时,图形不能分为上下 ...

  10. [AngularFire2] Building an Authentication Observable Data Service

    After successfully login, we want something help to check whether user has already login or not. And ...