Luogu-2600 [ZJOI2008]瞭望塔
把地面看成半平面,能看到所有位置的点所在的区域即为半平面的交
因为分段函数的极值只会在转折处或边界取到,所以对于半平面上和地面上的每一个交点都求一下距离就好了
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+100;
const double maxx=4e12;
struct Point{
    double x,y;
    Point(double xx=0,double yy=0){
        x=xx,y=yy;
    }
}a[maxn],p[maxn];
struct Vector{
    double x,y;
    Vector(double xx=0,double yy=0){
        x=xx,y=yy;
    }
};
struct Line{
    Point p;
    Vector v;
    double ang;
    Line(Point a=Point(),Vector b=Vector()){
        p=a,v=b;
        ang=atan2(v.y,v.x);
    }
}q[maxn],b[maxn];
int dcmp(double x){return fabs(x)<1e-10?0:(x>0?1:-1);}
Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
Point operator + (Point a,Vector b){return Point(a.x+b.x,a.y+b.y);}
Vector operator * (double p,Vector a){return Vector(a.x*p,a.y*p);}
double operator * (Vector a,Vector b){return a.x*b.y-a.y*b.x;}
double operator * (Point a,Point b){return a.x*b.y-a.y*b.x;}
bool operator < (Point a,Point b){return dcmp(a.x-b.x)==0?(dcmp(a.y-b.y)<0):(a.x<b.x);}
bool operator < (Line a,Line b){return dcmp(a.ang-b.ang)==0?(dcmp(a.v*(b.p-a.p))>0):(a.ang<b.ang);}
double len(Vector a){return sqrt(a.x*a.x+a.y*a.y);}
Point glt(Line a,Line b){Vector v=a.p-b.p; return a.p+b.v*v/(a.v*b.v)*a.v;}
bool onright(Line a,Line b,Line t){Point p=glt(a,b); return dcmp(t.v*(p-t.p))<0;}
void bpm(Line *b,int &n,Point *p){
    sort(b+1,b+n+1);
    int l=0,r=1,tot=0;
    for(int i=1;i<=n;i++){
        if(b[i].ang!=b[i-1].ang) tot++;
        b[tot]=b[i];
    }
    n=tot,q[0]=b[1],q[1]=b[2];
    for(int i=3;i<=n;i++){
        while(l<r&&onright(q[r],q[r-1],b[i])) r--;
        while(l<r&&onright(q[l],q[l+1],b[i])) l++;
        q[++r]=b[i];
    }
    while(l<r&&onright(q[r],q[r-1],q[l])) r--;
    while(l<r&&onright(q[l],q[l+1],q[r])) l++;
    n=0,q[r+1]=q[l];
    for(int i=l;i<=r;i++)
        b[++n]=q[i],p[n]=glt(q[i],q[i+1]);
}
int n;
void solve(Point *a,int m,Point *p,int n){
    sort(p+1,p+n+1);
//	for(int i=1;i<=n;i++) printf("%lf %lf\n",p[i].x,p[i].y);
    int l=2;
    double ans=maxx*2;
    for(int i=1;i<n;i++){
        while(l<m&&dcmp(p[i].x-a[l+1].x)>0) l++;
        Point pz=glt(Line(a[l],a[l+1]-a[l]),Line(p[i],Vector(0,1)));
        ans=min(ans,len(pz-p[i]));
    }
    l=1;
    for(int i=2;i<m;i++){
        while(l<n&&dcmp(a[i].x-p[l+1].x)>0) l++;
        Point pz=glt(Line(p[l],p[l+1]-p[l]),Line(a[i],Vector(0,1)));
        ans=min(ans,len(pz-a[i]));
    }
    printf("%.3lf\n",ans);
}
int main(){
    scanf("%d",&n),n++;
    for(int i=2;i<=n;i++) scanf("%lf",&a[i].x);
    for(int i=2;i<=n;i++) scanf("%lf",&a[i].y);
    a[1]=Point(a[2].x,maxx),a[n+1]=Point(a[n].x,maxx);
    int m=n+1;
    for(int i=1;i<=n;i++)
        b[i]=Line(a[i],a[i+1]-a[i]);
    bpm(b,n,p);
    solve(a,m,p,n);
    return 0;
}
Luogu-2600 [ZJOI2008]瞭望塔的更多相关文章
- 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔
		1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ... 
- 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村抽象为一维的轮廓.如 ... 
- 1038: [ZJOI2008]瞭望塔
		半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ... 
- 1038: [ZJOI2008]瞭望塔 - BZOJ
		Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ... 
- bzoj1038: [ZJOI2008]瞭望塔
		Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ... 
- [ZJOI2008]瞭望塔
		题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ... 
- 【BZOJ 1038】[ZJOI2008]瞭望塔
		[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] [题解] 可以看到所有村子的瞭望塔所在的位置只会是在相邻两个村子所代表 ... 
- [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何
		题意:给一条平面内$n$个点的折线,要求在折线上搞一个高度$h$的瞭望塔,能够看见折线上所有的点,求$h$的最小值($n \leq 300$) updata2018.1.21 正解半平面交在另一篇里面 ... 
随机推荐
- java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableBeanFactory.getSingletonMutex()Ljava/lang/Object
			© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述 搭建SSH框架,没有添加事务时一切正常,最后添加完事务后报错,并且怎么弄都是一样.报错信息如下: 警告: Exception encou ... 
- Atitit.异步编程的发展历史 1.1. TAP & async/await
			Atitit.异步编程的发展历史 1.1. TAP & async/await 1. 异步编程的发展历史1 1.1. Thread1 1.2. Task1 1.3. Async await2 ... 
- maven的一些基础命令
			1.显示当前构建的实际pom,包括活动的Profile mvn help:effective-pom 2.打印出项目的世界settings,包含从全局的settings和用户级别settings继承的 ... 
- MS coco数据集下载
			2017年12月02日 23:12:11 阅读数:10411 登录ms-co-co数据集官网,一直不能进入,FQ之后开看到下载链接.有了下载链接下载还是很快的,在我这儿晚上下载,速度能达到7M/s,所 ... 
- HTML5 2D平台游戏开发#6地图绘制
			此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-base ... 
- openWRT自学---自己编译的第一个 backfire10.03 版本的过程记录 --- 实际是由于下载了错误的backfire源码包导致的
			基于 backfire10.03(从http://downloads.openwrt.org/backfire/10.03/ 中下砸的源码包backfire_10.03_source.tar.bz2: ... 
- 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略
			转自:http://blog.csdn.net/gao5528/article/details/6256119 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略(K5系列产品篇) 一年 ... 
- laravel学习之路4artisan
			php artisan list php artisan help migrate Tinker 让你可以在命令行中与 Laravel 应用进行交互php artisan tinker 在routes ... 
- Lumen开发:lumen源码解读之初始化(1)——app实例
			版权声明:本文为博主原创文章,未经博主允许不得转载. 有些注释来着原文的百度翻译,可以有些难理解或者奇怪,我后面会根据自己的理解做调整的哈!!!不喜勿喷,层主英语不过关... 先来看看入口文件publ ... 
- C语言中的指针运算
			int a[5]={1,2,3 ,4,5} *p=a; *p++ 等价于*(p++) 等价于a[i++](i++ i首先会被使用任何进行自+) *++p等价于*(++p) 等价于 a[++i] (++ ... 
