这回好好用半平面交写一次…

看了cls当年写的代码看了好久大概看懂了…cls太强辣

#include<cstdio>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(register int i=1;i<=n;i++)
#define REP(i,a,b) for(register int i=a;i<=b;i++)
#define debug(x) cout<<#x<<" = "<<x<<endl
typedef double dl;
using namespace std;
const int N=305;
const dl INF=~0u>>1;
struct P
{
dl x,y;
P(dl x=0,dl y=0):x(x),y(y){}
}p[N],ps[N];
struct L
{
dl k,b;
}l[N];
inline bool operator < (L a,L b){return a.k<b.k||(a.k==b.k&&a.b>b.b);}
inline bool operator==(L a,L b){return a.k==b.k;}
inline dl get_x(L a,L b){return -(b.b-a.b)/(b.k-a.k);}
inline dl get_val(L a,dl x){return a.k*x+a.b;}
inline L get_line(P a,P b)
{
L res;res.k=(a.y-b.y)/(a.x-b.x);
res.b=a.y-res.k*a.x;return res;
}
inline double calc(dl x,L a,L b)
{
return get_val(a,x)-get_val(b,x);
}
int r,m,n;
inline void input()
{
scanf("%d",&n);
rep(i,n)scanf("%lf",&p[i].x);
rep(i,n)scanf("%lf",&p[i].y);
}
inline void work()
{
rep(i,n-1)l[i]=get_line(p[i],p[i+1]);
m=n-1;sort(l+1,l+m+1);m=unique(l+1,l+m+1)-l-1;
rep(i,m)
{
while(r>1&&get_x(l[r],l[r-1])-get_x(l[r-1],l[i])>=0)r--;l[++r]=l[i];
}m=r;
int i=1,j=1;dl ans=1e30;
#define updata(x) ans=min(ans,calc(x,l[j],get_line(p[i],p[i+1])))
while(i<n&&j<=m)
{
dl L=(j>1?get_x(l[j-1],l[j]):-INF);
dl R=(j<m?get_x(l[j],l[j+1]):INF);
if(L>p[i+1].x){i++;continue;}
if(R<p[i].x){j++;continue;}
updata(max(L,p[i].x));updata(min(R,p[i+1].x));
if(R<p[i+1].x)j++;
else i++;
}
if(n<=2)ans=0;
printf("%.3lf",ans);
}
int main()
{
//freopen("input.in","r",stdin);
input();
work();
return 0;
}

[日常摸鱼]bzoj1038[ZJOI2008]瞭望塔-半平面交的更多相关文章

  1. [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何

    题意:给一条平面内$n$个点的折线,要求在折线上搞一个高度$h$的瞭望塔,能够看见折线上所有的点,求$h$的最小值($n \leq 300$) updata2018.1.21 正解半平面交在另一篇里面 ...

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

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

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

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

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

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

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

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

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

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

  7. BZOJ-1038 [ZJOI2008]瞭望塔

    先求半平面交,然后建塔的地方肯定是在半平面交的交点上或者是在地面线段的交点上. #include <cstdlib> #include <cstdio> #include &l ...

  8. bzoj1038: [ZJOI2008]瞭望塔

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

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

    http://m.blog.csdn.net/blog/qpswwww/44105605 #include<cstdio> #include<cmath> #include&l ...

随机推荐

  1. CorelDRAW多个文件如何批量导出JPG

    好多同学对于CorelDRAW 2018批量导出图片格式的操作不太了解.这种情况比较常见,比如设计了一本画册,在同一个文档中页面比较多,如果一页一页导出那将是一项巨大的工程,这时候我们就会想到CDR的 ...

  2. 下载器Folx如何实现排队下载功能

    用户在下载多个文件时,当然会希望这些文件都能同时下载,以达到短时间内完成下载任务的目的.但另一方面来说,同时下载过多文件,会分散带宽资源,降低了每个文件的下载速度,从而导致下载时间的延长. 为了实现多 ...

  3. 使用OwnCloud建立属于自己私有的云存储网盘

    1.需要LAMP架构 实验环境:centos7.4 64位系统[root@xuegod63 ~]# yum install -y httpd php php-mysql mariadb-server ...

  4. 学习Java的第一步,配置电脑环境

    JAVA安装与配置 俗话说的好,工欲善其事,必先利其器,想要学习Java,那么我们首先需要一个能够进行学习的环境. 一.安装JDK 为什么要安装jdk,jdk是什么? ​ JDK是java软件开发包( ...

  5. cert-manager管理内网k8s开发环境证书

    目的 内网k8s开发环境配置HTTPS,保持与生产环境的配置的一致性,其必要性有: PWA开发,HTTPS是必要条件 网页引入HTTP资源,如果开发环境是HTTP就不会被开发和测试人员发现,造成生产环 ...

  6. Python中排序函数sorted和排序方法sort的异同点对比分析

    Python中对序列进行排序有两种方法,一种是使用python内置的全局sorted函数,另一种是使用序列内置的sort方法. 一. 两者相同点 在支持sort方法的序列中都可以对序列进行排序: 二者 ...

  7. JAVA课堂作业(2019.10.14)

    一. (1)代码 package class20191014; import java.util.Scanner; public class ClassHomework { public static ...

  8. POJ_1961

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 19817   Accepted: 9640 Descripti ...

  9. VirtualBox安装Centos出现E_FAIL (0x80004005)的解决方法

    问题描述:UUID已经存在 Cannot register the hard disk 'F:\hadoop\VirtualBox-centos\centos6.4\centos6.4.vdi' {0 ...

  10. mysql 创建新用户、数据库、授权

    创建用户 1.登录mysql mysql -uroot -p 2.创建本地用户(2.3选其一) #use mysql;             //选择mysql数据库 #create user 'w ...