学习了半平交面。

我这里写的是训练指南中的双端队列,每次判断是否删去更优然后更新。

看hzwer中有一处不太明白就是为何要将两段加入队列

后来对拍出错才知道是因为精度,当两线重合时他们叉积返回值是一个极小值

所以判断一下精度即可。

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,cnt,tot;double ans=1e20,eps=1e-;
struct point{
double x,y;
}a[N],p[N];
point operator -(point a,point b){
point t;t.x=b.x-a.x;t.y=b.y-a.y;
return t;
}
double operator *(point a,point b){
return a.x*b.y-a.y*b.x;
}
struct line{
point a,b;double slop;
bool operator <(const line &B)const{
return slop==B.slop?(b-a)*(B.b-a)>:slop<B.slop;
}
}l[N],s[N];
point inter(line a,line b){
double k1,k2,t;
k1=(b.b-a.a)*(a.b-a.a);
k2=(a.b-a.a)*(b.a-a.a);
t=k1/(k1+k2);
point ans;
ans.x=b.b.x+(b.a.x-b.b.x)*t;
ans.y=b.b.y+(b.a.y-b.b.y)*t;
return ans;
}
bool jud(line a,line b,line t)
{
point pp=inter(a,b);
return (t.b-t.a)*(pp-t.a)<-eps;
}
void hpl()
{
int L=,R=;
for(int i=;i<=cnt;++i)
{
if(l[i].slop!=l[i-].slop)++tot;
l[tot]=l[i];
}
cnt=tot;tot=;
s[++R]=l[];s[++R]=l[];
for(int i=;i<=cnt;++i)
{
while(L<R&&jud(s[R-],s[R],l[i]))R--;
while(L<R&&jud(s[L+],s[L],l[i]))L++;
s[++R]=l[i];
}
while(L<R&&jud(s[R-],s[R],s[L]))R--; while(L<R&&jud(s[L+],s[L],s[R]))L++;
for(int i=L;i<R;++i)
a[++tot]=inter(s[i],s[i+]);
}
void getans()
{
for(int i=;i<=tot;++i)
{
point t;t.x=a[i].x;t.y=-;
for(int j=;j<n;++j)
if(p[j].x<=a[i].x&&p[j+].x>=a[i].x)
ans=min(ans,a[i].y-inter((line){p[j],p[j+]},(line){t,a[i]}).y);
}
for(int i=;i<=n;++i)
{
point t;t.x=p[i].x;t.y=-;
for(int j=;j<tot;++j)
if(a[j].x<=p[i].x&&a[j+].x>=p[i].x)
ans=min(ans,inter((line){a[j],a[j+]},(line){t,p[i]}).y-p[i].y);
}
}
int main()
{
// freopen("1.out","r",stdin);
// freopen("my.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%lf",&p[i].x);
for(int i=;i<=n;++i)scanf("%lf",&p[i].y);
// p[0].x=p[1].x;p[0].y=1e9;
// p[n+1].x=p[n].x;p[n+1].y=1e9;
for(int i=;i<n;++i)l[++cnt].a=p[i],l[cnt].b=p[i+];
if(cnt<){
puts("0.000");return ;
}
for(int i=;i<=cnt;++i)
l[i].slop=atan2(l[i].b.y-l[i].a.y,l[i].b.x-l[i].a.x);
sort(l+,l++cnt);
hpl();
getans();
printf("%.3lf",ans);
return ;
}

BZOJ1038 瞭望塔的更多相关文章

  1. 【bzoj1038】瞭望塔

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

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

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

  3. bzoj1038: [ZJOI2008]瞭望塔

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

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

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

  5. 【bzoj1038】瞭望塔 半平面交

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

  6. 【BZOJ1038】【ZJOI2008】瞭望塔 [模拟退火]

    瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 致力于建设全国示范和谐小村庄的H村村 ...

  7. 「BZOJ1038」「洛谷P2600」「ZJOI2008」瞭望塔 半平面交+贪心

    题目链接 BZOJ/洛谷 题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示: 我们可以用一条山的上方 ...

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

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

  9. 刷题总结——瞭望塔(bzoj1038)

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

随机推荐

  1. 【最大流】【CODEVS】1993 草地排水

    [算法]网络流-最大流(dinic) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html #include<cstdio> #includ ...

  2. 源自人脑的神奇算法 -- 读《How to make your own neural network》有感

    最近读到了一本很好的关于机器学习-深度学习的书值得推荐下并特意做了这个学习总结. 为什么推荐 在我认为好书(计算机类)的评判有几个标准: 试图以通俗的语言阐述,并在引入任何新概念的时候都讲述来龙去脉, ...

  3. iOS 程序启动流程

    iOS程序启动原理   技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong   iOS应用程序运行 ...

  4. NYOJ 257 郁闷的C小加(一) (字符串处理)

    题目链接 描述 我们熟悉的表达式如a+b.a+b(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符 ...

  5. 第5堂音频课:发音&词串&自学方法示范

    1. 发音怎么练习 我讲解的第5-6节发音课,就像一个有用教练,教你的划水姿势,你学了以后,在床上趴着练练蹬腿,然后,要立刻跳下水去游泳,也就是说,你要去听英语: 请你听一段可可宝贝APP的绘本故事, ...

  6. 常见的bug

    常见bug 一. Android系统功能测试设计的测试用例: a.对所测APP划分模块 b.详细列出每个模块的功能点(使用Xmind绘制功能图) c.使用等价类划分.边界值.场景法等对各功能点编写测试 ...

  7. 【转载】selenium之 定位以及切换frame(iframe)

    更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解 总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切,frame需层 ...

  8. NFS挂载报如下错误信息:mount.nfs: Stale NFS file handle解决

    1)用fuser杀掉占用那个目录的进程 linux:~ # fuser -k /home/msgplus/msgplus/remote_dir 2)强制umount linux:~ # umount ...

  9. nginx allow 多个ip & ipv4的网段表示方法解析

    参考:https://www.baidu.com/link?url=5aVe_syihQzhHnSDAdLsNNQYqDe_W2GYG1GeIQ130e4mEZbusxQfqGVTdg-dJg8fqM ...

  10. 产生随机数 random

    int rand(void); 返回 0 ------- RAND_MAX 之间的一个 int 类型整数,该函数为非线程安全函数.并且生成随机数的性能不是很好,已经不推荐使用.        void ...