描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1020

给出一条航线(折线),给出\(c\)个陆地(多边形).求航线上距离陆地的最近距离最远的距离.

分析


也是一道神题...

 #include <bits/stdc++.h>
using namespace std; const int maxn=+,maxm=+,maxq=1e6;
const double eps=1e-;
int c,n;
double ans;
inline int dcmp(double x){ if(fabs(x)<eps) return ; else return x>?:-; }
struct pt{
double x,y;
pt(double x=,double y=):x(x),y(y){}
pt operator + (const pt &a) const { return pt(x+a.x,y+a.y); }
pt operator - (const pt &a) const { return pt(x-a.x,y-a.y); }
pt operator * (const double &p) const { return pt(x*p,y*p); }
pt operator / (const double &p) const { return pt(x/p,y/p); }
pt normal(){ return pt(-y,x); }
bool operator == (const pt &a) const { return !dcmp(x-a.x)&&!dcmp(y-a.y); }
void read(){ scanf("%lf%lf",&x,&y); }
}A[maxn];
typedef pt vt;
inline double dot(vt a,vt b){ return a.x*b.x+a.y*b.y; }
inline double crs(vt a,vt b){ return a.x*b.y-a.y*b.x; }
inline double len(vt a){ return sqrt(dot(a,a)); }
struct sg{
pt a,b;
sg(){}
sg(pt a,pt b):a(a),b(b){}
bool on(const pt &p){ return !dcmp(crs(a-p,b-p))&&dcmp(dot(a-p,b-p))<; }
}q[maxq];
struct polygon{
int cnt; pt p[maxm];
bool in(const pt &a){
int wn=;
for(int i=;i<=cnt;i++){
if(sg(p[i],p[i%cnt+]).on(a)) return true;
int k=dcmp(crs(p[i%cnt+]-p[i],a-p[i]));
int d1=dcmp(p[i].y-a.y);
int d2=dcmp(p[i%cnt+].y-a.y);
if(k>&&d1<=&&d2>) wn++;
if(k<&&d2<=&&d1>) wn--;
}
return wn;
}
}land[maxn];
struct node{
pt p; double d;
node(){}
node(pt p,double d):p(p),d(d){}
};
inline pt get_l_int(pt p,vt v,pt q,vt w){
vt u=p-q;
double t=crs(w,u)/crs(v,w);
return p+v*t;
}
inline node dis_to_sg(pt p,pt a,pt b){
vt v1=b-a,v2=p-a,v3=p-b;
if(dcmp(dot(v1,v2)<)) return node(a,len(v2));
else if(dcmp(dot(v1,v3)>)) return node(b,len(v3));
else return node(get_l_int(p,v1.normal(),a,v1),fabs(crs(v1,v2)/len(v1)));
}
inline node find(pt a){
node t; t.d=<<;
for(int i=;i<=c;i++){
if(land[i].in(a)) return node(a,);
for(int j=;j<=land[i].cnt;j++){
node tmp=dis_to_sg(a,land[i].p[j],land[i].p[j%land[i].cnt+]);
if(dcmp(tmp.d-t.d)<) t=tmp;
}
}
ans=max(ans,t.d);
return t;
}
inline void init(){
scanf("%d%d",&c,&n);
for(int i=;i<=n;i++) A[i].read();
for(int i=;i<=c;i++){
scanf("%d",&land[i].cnt);
for(int j=;j<=land[i].cnt;j++) land[i].p[j].read();
}
}
inline void solve(){
int L=,R=;
for(int i=;i<n;i++) q[R++]=sg(A[i],A[i+]);
while(L!=R){
sg t=q[L++]; if(L==maxq) L=;
pt p1=find(t.a).p, p2=find(t.b).p,l=t.a,r=t.b,mid=(l+r)/;
while(len(l-r)>1e-){
mid=(l+r)/;
if(len(mid-p1)<len(mid-p2)) l=mid;
else r=mid;
}
double tmp=min(len(mid-p1),len(mid-p2));
if(ans+0.0001<tmp){
q[R++]=sg(t.a,mid); if(L==maxq) L=;
q[R++]=sg(mid,t.b); if(L==maxq) L=;
}
}
printf("%.2lf\n",ans);
}
int main(){
init();
solve();
return ;
}

1020: [SHOI2008]安全的航线flight

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1021  Solved: 346
[Submit][Status][Discuss]

Description

  在设计航线的时候,安全是一个很重要的问题。首先,最重要的是应采取一切措施确保飞行不会发生任何事故
,但同时也需要做好最坏的打算,一旦事故发生,就要确保乘客有尽量高的生还几率。当飞机迫降到海上的时候,
最近的陆地就是一个关键的因素。航线中最危险的地方就是距离最近的陆地最远的地方,我们称这种点为这条航线
“孤地点”。孤地点到最近陆地的距离被称为“孤地距离”。作为航空公司的高级顾问,你接受的第一个任务就是
尽量找出一条航线的孤地点,并计算这条航线的孤地距离。为了简化问题,我们认为地图是一个二维平面,陆地可
以用多边形近似,飞行线路为一条折线。航线的起点和终点都在陆地上,但中间的转折点是可能在海上(如下图所
示,方格标示出了孤地点)。

Input

  输入的第一行包括两个整数C和N(1≤C≤20,2≤N≤20),分别代表陆地的数目的航线的转折点的数目。接下
来有N行,每行有两个整数x,y。(x,y)表示一个航线转折点的坐标,第一个转折点为航线的起点,最后一个转折点
为航线的终点。接下来的输入将用来描述C块大陆。每块输入由一个正整数M开始(M≤30),M表示多边形的顶点个
数,接下来的M行,每行会包含两个整数x,y,(x,y)表示多边形的一个顶点坐标,我们保证这些顶点以顺时针或逆
时针给出了该多边形的闭包,不会出现某些边相交的情况。此外我们也保证输入数据中任何两块大陆不会相交。输
入的所有坐标将保证在-10000到10000的范围之间。

Output

  输出一个浮点数,表示航线的孤地距离,数据保留2位小数。

Sample Input

1 2
-9 -6
5 1
3
0 16
-16 -12
17 -6

Sample Output

0.00

HINT

Source

BZOJ_1020_[SHOI2008]_安全的航线flight_(计算几何+二分)的更多相关文章

  1. 【BZOJ】【1020】【SHOI2008】安全的航线flight

    计算几何/二分/迭代/搜索+剪枝 写三个tag可能是因为从哪个方向来理解都可以吧…… 我完全不会计算几何所以抄了ydc的代码 题解:http://ydcydcy1.blog.163.com/blog/ ...

  2. 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

    题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...

  3. BZOJ_1022_[SHOI2008]_小约翰的游戏John_(博弈论_反Nim游戏)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1022 反Nim游戏裸题.详见论文<组合游戏略述——浅谈SG游戏的若干拓展及变形>. ...

  4. BZOJ_1019_[SHOI2008]_汉诺塔_(DP)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1019 汉诺塔游戏,但是有移动优先级,在不违反原有规则的情况下,给定优先移动目标.求完成游戏所需 ...

  5. BZOJ_1018_[SHOI2008]_交通堵塞traffic_(线段树)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1018 \(2*n\)的距形,起初没有边相连,之后有三种操作: 1.加边. 2.删边. 3.询问 ...

  6. BUAA_C++算法板子积累_动态规划、图算法、计算几何、FFT

    Hello #include <iostream> #include <cstdio> #include <cctype> #include <cmath&g ...

  7. BZOJ_1024_[SHOI2008]_生日快乐_(dfs)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1024 给出一个\(x*y\)的距形,要求平行于边切,最终切成\(n\)个面积相等的小距形,求长 ...

  8. [ An Ac a Day ^_^ ] CodeForces 659D Bicycle Race 计算几何 叉积

    问有多少个点在多边形内 求一遍叉积 小于零计数就好了~ #include<stdio.h> #include<iostream> #include<algorithm&g ...

  9. 【POJ】2318 TOYS ——计算几何+二分

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description ...

随机推荐

  1. Spark Streaming揭秘 Day21 动态Batch size实现初探(下)

    Spark Streaming揭秘 Day21 动态Batch size实现初探(下) 接昨天的描述,今天继续解析动态Batch size调整的实现. 算法 动态调整采用了Fix-point迭代算法, ...

  2. Oracle SGA参数调整

    一. SGA的组成: 自动 SGA 管理后,Oracle 可以自动为我们调整以下内存池的大小: shared pool buffer cache large pool java pool stream ...

  3. php 时间转化总结

    iQuery插件datepicker获取的时间函数为"月月/天天/年年年年"(以04/21/2015为例)的形式 (1)转化为2015-21-04形式:$start = date( ...

  4. Security log is full,only administrator can log on to fix the problem(安全日志满了)

    When you login the system and see this error  “Security log on this system is full,only administrato ...

  5. OFBIZ bug_create-component ERROR

    开发环境:win7 64位 Eclipse 运行create-component,报一下错误: Buildfile: F:\workspace\opensource\apache-obiz\apach ...

  6. GridView ItemCommand

    GridView ItemCommand中取某行某列的值方法,这里提供两个常用的: 一.用CommandArgument属性取值页面如下: <asp:TemplateColumn HeaderT ...

  7. WebUploader API

    Uploader new Uploader( opts ) ⇒ Uploader 上传入口类. var uploader = WebUploader.Uploader({ swf: 'path_of_ ...

  8. 一道简单的IOS面试题-b

    题目: (参考:陈曦 包子的iOS开发)我在code review的时候,发现了某个viewController中有这样一段代码,觉得很不妥当,请尝试找出代码中的任何问题,或者可以优化的部分. -(i ...

  9. apache与nginx日志文件的区别(转载)

    apache与nginx日志文件的区别 转载:http://www.xfcodes.com/apache/log/3270.htm 导读:apache与nginx日志文件的区别,在apache与ngi ...

  10. uva 11461

    简单 打个表 case数不超过200 数据比较水  木有超时的风险~~ /*************************************************************** ...