传送门

暴力也行,退火也行,不是很明白为啥还要用半平面交……

总之就是把原来的所有限制看成一堆半平面

根据黄学长的博客塔肯定建在转折处最优

//minamoto
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
int read(){
int res,f=1;char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1005;
struct node{double x,y;}p[N],a[N];
struct L{node a,b;double sl;}l[N],q[N];
int n,cnt,top,tot;double ans=1e60;
inline node operator -(node a,node b){return {a.x-b.x,a.y-b.y};}
inline double operator *(node a,node b){return a.x*b.y-a.y*b.x;}
inline bool operator <(L a,L b){
if(a.sl!=b.sl)return a.sl<b.sl;
return (a.b-a.a)*(b.b-a.a)<0;
}
node inter(L a,L 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);
return {b.b.x+(b.a.x-b.b.x)*t,b.b.y+(b.a.y-b.b.y)*t};
}
inline bool jd(L a,L b,L t){node p=inter(a,b);return (t.b-t.a)*(p-t.a)<0;}
void hpi(){
int h=1,t=0;tot=0;
fp(i,1,cnt)if(l[i].sl!=l[i-1].sl)l[++tot]=l[i];
cnt=tot,q[++t]=l[1],q[++t]=l[2];
fp(i,3,cnt){
while(h<t&&jd(q[t-1],q[t],l[i]))--t;
while(h<t&&jd(q[h+1],q[h],l[i]))++h;
q[++t]=l[i];
}
while(h<t&&jd(q[t-1],q[t],q[h]))--t;
while(h<t&&jd(q[h+1],q[h],q[t]))++h;
tot=0;fp(i,h,t-1)a[++tot]=inter(q[i],q[i+1]);
}
void init(){
p[0]={p[1].x,100001},p[n+1]={p[n].x,100001};
fp(i,1,n){
l[++cnt].a=p[i-1],l[cnt].b=p[i];
l[++cnt].a=p[i],l[cnt].b=p[i+1];
}
fp(i,1,cnt)l[i].sl=atan2(l[i].b.y-l[i].a.y,l[i].b.x-l[i].a.x);
sort(l+1,l+1+cnt);
}
void getans(){
fp(k,1,tot)fp(i,1,n-1)if(a[k].x>=p[i].x&&a[k].x<=p[i+1].x){
node t;t.x=a[k].x,t.y=-1;
cmin(ans,a[k].y-inter(L{p[i],p[i+1]},L{t,a[k]}).y);
}
fp(k,1,n)fp(i,1,tot-1)if(p[k].x>=a[i].x&&p[k].x<=a[i+1].x){
node t;t.x=p[k].x,t.y=-1;
cmin(ans,inter(L{a[i],a[i+1]},L{t,p[k]}).y-p[k].y);
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();fp(i,1,n)p[i].x=read();fp(i,1,n)p[i].y=read();
init(),hpi(),getans();
printf("%.3lf\n",ans);return 0;
}

P2600 [ZJOI2008]瞭望塔的更多相关文章

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

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

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

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

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

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

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

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

  5. 1038: [ZJOI2008]瞭望塔

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

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

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

  7. bzoj1038: [ZJOI2008]瞭望塔

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

  8. [ZJOI2008]瞭望塔

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

  9. 【BZOJ 1038】[ZJOI2008]瞭望塔

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] [题解] 可以看到所有村子的瞭望塔所在的位置只会是在相邻两个村子所代表 ...

随机推荐

  1. 开启POP3/SMTP服务

    实现发送邮件时需要先启用POP3/SMTP服务(以qq邮箱和网易邮箱启用为例) 一 qq邮箱启用 二.网易邮箱开启POP3/SMTP服务 至此:服务已开启

  2. python gdal库安装

    yum安装了postgis之后,会安装依赖gdal centos7.5的repo中gdal为1.11.4-3版本

  3. 全文搜索(AB-2)-权重

    概念 权重是一个相对的概念,针对某一指标而言.某一指标的权重是指该指标在整体评价中的相对重要程度.权重是要从若干评价指标中分出轻重来,一组评价指标体系相对应的权重组成了权重体系. 释义 等同于比重   ...

  4. c++中的string常用函数用法总结!

    标准c++中string类函数介绍 注意不是CString 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作 ...

  5. GitHub & puppeteer & Chinese character & bug

    GitHub & puppeteer & Chinese character & bug https://github.com/GoogleChrome/puppeteer/b ...

  6. HDU 5024

    题目大意: 在2个图上显示为'.'的位置建两座房间,保证这两间房子中间只转一个90度的弯,可以斜着走,问能建成房子的最远的路程长度为多少 暴力枚举 因为有8个方向,但横竖走和斜着走是不会产生90度角的 ...

  7. msp430入门学习13

    msp430的定时器--Timer_B(定时器B)

  8. POJ 2240_Arbitrage

    题意: 给定一系列货币汇率,求能否从一种货币,经过一系列转换,最终转化回更高价值的该种货币. 分析: 即为求最长路并判断是否存在"正"权值回路,这里用的bellmanford算法. ...

  9. [bzoj3991][SDOI2015]寻宝游戏_树链的并_倍增lca_平衡树set

    寻宝游戏 bzoj-3991 SDOI-2015 题目大意:题目链接. 注释:略. 想法:我们发现如果给定了一些点有宝物的话那么答案就是树链的并. 树链的并的求法就是把所有点按照$dfs$序排序然后相 ...

  10. webpack 输出多个文件

    http://react-china.org/t/webpack/1870/2 webpack 文章 entry = { "button": "demo/button/i ...