首先将速度相减,变成A在动而B不动,若速度为0则显然永远不会相交。

枚举A的每个点以及B的每条线段,计算这三个点共线的时刻。

将时刻排序,对于每个区间进行三分,用半平面交计算相交面积。

注意特判相交面积为0但是存在交点的情况。

时间复杂度$O(n^4\log^2n)$。

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=200;
const double eps=1e-9;
int sgn(double x){if(x<-eps)return -1;if(x>eps)return 1;return 0;
}
int n,m,cnt,i,j,vx,vy,x,y;double q[N],ans=-1,anst;
struct vec{double x,y;vec(){x=y=0;}vec(double _x,double _y){x=_x,y=_y;}vec operator+(vec v){return vec(x+v.x,y+v.y);}vec operator-(vec v){return vec(x-v.x,y-v.y);}vec operator*(double v){return vec(x*v,y*v);}vec operator/(double v){return vec(x/v,y/v);}double operator*(vec v){return x*v.x+y*v.y;}double len(){return hypot(x,y);}double len_sqr(){return x*x+y*y;}
}a[N],b[N],c[N],v,o;
double cross(vec a,vec b){return a.x*b.y-a.y*b.x;}
bool point_on_segment(vec p,vec a,vec b){return sgn(cross(b-a,p-a))==0&&sgn((p-a)*(p-b))<=0;
}
int has_intersection(vec a,vec b,vec p,vec q){int d1=sgn(cross(b-a,p-a)),d2=sgn(cross(b-a,q-a)),d3=sgn(cross(q-p,a-p)),d4=sgn(cross(q-p,b-p));if(d1*d2<0&&d3*d4<0)return 1;if(d1==0&&point_on_segment(p,a,b))return -1;if(d2==0&&point_on_segment(q,a,b))return -1;if(d3==0&&point_on_segment(a,p,q))return -1;if(d4==0&&point_on_segment(b,p,q))return -1;return 0;
}
int line_intersection(vec a,vec b,vec p,vec q,vec&o){double U=cross(p-a,q-p),D=cross(b-a,q-p);if(sgn(D)==0)return 0;o=a+(b-a)*(U/D);return 1;
}
struct P{double x,y;P(){x=y=0;}P(double _x,double _y){x=_x,y=_y;}P(vec p){x=p.x,y=p.y;}P operator-(const P&a)const{return P(x-a.x,y-a.y);}P operator+(const P&a)const{return P(x+a.x,y+a.y);}P operator*(double a)const{return P(x*a,y*a);}
};
namespace Halfplane{
P p[N],a[N];
struct L{P p,v;double a;L(){}L(P _p,P _v){p=_p,v=_v;}bool operator<(const L&b)const{return a<b.a;}void cal(){a=atan2(v.y,v.x);}
}line[N],q[N];
int cl;
double cross(const P&a,const P&b){return a.x*b.y-a.y*b.x;}
void newL(const P&a,const P&b){line[++cl]=L(a,b-a);}
bool left(const P&p,const L&l){return cross(l.v,p-l.p)>0;}
P pos(const L&a,const L&b){P x=a.p-b.p;double t=cross(b.v,x)/cross(a.v,b.v);return a.p+a.v*t;
}
double halfplane(){for(int i=1;i<=cl;i++)line[i].cal();sort(line+1,line+cl+1);int h=1,t=1;q[1]=line[1];for(int i=2;i<=cl;i++){while(h<t&&!left(p[t-1],line[i]))t--;while(h<t&&!left(p[h],line[i]))h++;if(fabs(cross(q[t].v,line[i].v))<eps)q[t]=left(q[t].p,line[i])?q[t]:line[i];else q[++t]=line[i];if(h<t)p[t-1]=pos(q[t],q[t-1]);}while(h<t&&!left(p[t-1],q[h]))t--;p[t]=pos(q[t],q[h]);if(t-h<=1)return -1;double ans=0;for(int i=h;i<t;i++)ans+=cross(p[i],p[i+1]);return ans+cross(p[t],p[h]);
}
}
double cal(double T){if(!sgn(T))return -1;double ret=-1;int i,j;for(i=0;i<=n;i++)c[i]=a[i]+(v*T);for(i=0;i<n;i++)for(j=0;j<m;j++)if(has_intersection(c[i],c[i+1],b[j],b[j+1]))ret=0;Halfplane::cl=0;for(i=0;i<n;i++)Halfplane::newL(P(c[i+1]),P(c[i]));for(i=0;i<m;i++)Halfplane::newL(P(b[i+1]),P(b[i]));ret=max(ret,Halfplane::halfplane());if(sgn(ret-ans)>0||(sgn(ret-ans)==0&&T<anst))ans=ret,anst=T;return ret;
}
int main(){scanf("%d",&n);for(i=0;i<n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);a[n]=a[0];scanf("%d%d",&vx,&vy);scanf("%d",&m);for(i=0;i<m;i++)scanf("%lf%lf",&b[i].x,&b[i].y);b[m]=b[0];scanf("%d%d",&x,&y);vx-=x,vy-=y;if(!vx&&!vy)return puts("never"),0;v=vec(vx,vy);q[cnt=1]=0;for(i=0;i<n;i++)for(j=0;j<m;j++)if(line_intersection(a[i],a[i]+v,b[j],b[j+1],o))q[++cnt]=(o-a[i]).len()/v.len();sort(q+1,q+cnt+1);for(i=1;i<=cnt;i++)cal(q[i]);for(i=1;i<cnt;i++){double l=q[i],r=q[i+1];while(l+1e-6<r){double len=(r-l)/3,m1=l+len,m2=r-len;double f1=cal(m1),f2=cal(m2);if(sgn(f1-f2)>=0)r=m2;else l=m1;}}if(ans<-0.5)puts("never");else printf("%.6f",anst);return 0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/5652032.html

BZOJ4107 : [Wf2015]Asteroids相关推荐

  1. OpenGL 行星asteroids系统的实例

    OpenGL 行星asteroids系统 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include ...

  2. 【POJ - 3041】Asteroids (二分图,最小点覆盖)

    题干: Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x ...

  3. POJ 3041 Asteroids (对偶性,二分图匹配)

    题目:POJ 3041 Asteroids http://poj.org/problem?id=3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好. 挑战 ...

  4. 【BZOJ4108】[Wf2015]Catering 有上下界费用流

    [BZOJ4108][Wf2015]Catering Description 有一家装备出租公司收到了按照时间顺序排列的n个请求. 这家公司有k个搬运工.每个搬运工可以搬着一套装备按时间顺序去满足一些 ...

  5. HDU1240 POJ2225 Asteroids!【BFS】

    Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  6. HDU 1240 Asteroids!(DFS简单搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1240 Asteroids! Time Limit: 2000/1000 MS (Java/Others ...

  7. hdu1240题解与思考 Asteroids!

    hdu1240题解与思考 Asteroids! 题意: 简单说就是走一个三维的迷宫 思路: 解决迷宫的思路当然就是队列+bfs啦,三位迷宫只要注意改一下检测数组vis为三位数组就可以了,当然这个题目也 ...

  8. POJ T3041 Asteroids

    POJ T3041 Asteroids 题解: 如果没学过匈牙利算法的话,鄙人感觉会去暴力. 匈牙利算法已经有很好的博客了,鄙人就不在这赘述了. 代码: #include<cstdio> ...

  9. P7368 [USACO05NOV]Asteroids G(k o¨ nig)

    [USACO05NOV]Asteroids G - 洛谷https://www.luogu.com.cn/problem/P7368题目让我们求最小代价,我们可以考虑那些点在同一行和同一列得,所以我们 ...

最新文章

  1. 使用U盘装系统步骤详解
  2. 一季度手机出货量少了2800万部,有人要给「指条明路」
  3. [Android] 环境配置之Android Studio开发NDK
  4. eclipse工具连接mysql_eclipse工具中使用Data Source Explorer连接数据库(MySQL)
  5. 【Linux系统编程】信号 (下)
  6. JDK的可视化工具系列 (四) JConsole、VisualVM
  7. 二分查找的平均查找长度_二分查找
  8. 一个新基民的感叹:人心不足蛇吞象
  9. Linux下环境搭建(一)——java、tomcat配置
  10. Oracle查看IP操作,Oracle VM VirtualBox虚拟机ip addr命令查看ip不显示以及静态IP设置
  11. 车辆检测技术的应用分析
  12. 企业内IT部/信息部发展阶段和趋势(第一阶段)
  13. Pygame实战:Python趣味编程之我的兔子终于变了游戏啦
  14. linux和pe修复win10启动项,pe下如何重建win10引导?pe下win10引导修复图文教程
  15. UDP打洞、P2P组网方式研究
  16. C语言实现,输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
  17. c语言解析hex文件格式,HEX文件格式,ihex,hex解析
  18. 作为技术分析工具的 MTF 指标
  19. android微信群聊功能,微信安卓内测更新,这个群聊功能等了8年
  20. 市面上有哪几种门_卧室门怎么选?市面上5种常见房门大揭秘

热门文章

  1. 【qduoj】【超级楼梯进阶版】
  2. Apollo自动驾驶入门课程第③讲 — 定位
  3. Angular相关的有价值的问题集锦
  4. 最有效的萨克斯弱音器_1990到2016年全球自杀数据公布,中国自杀死亡率下降最显著!...
  5. elementui vue的html随机点名器软件网页版源码1.1
  6. 普通IO流字符输入输出流文件拷贝
  7. 博途中用的是c吗_一只“66 鸭”离奇出走,只为助蛋宝宝C位出道
  8. android6.0 sd卡卸载api,android6.0 用户关掉sd卡读取权限的情况下, 还能做到手机缓存么?...
  9. java设计模式之模板模式
  10. java合并list_java合并list方法代码实例