BZOJ4107 : [Wf2015]Asteroids

首先将速度相减,变成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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web Service 性能测试工具比较

背景 希望选择一款Web Service性能测试工具&#xff0c;能真实模拟大量用户访问网站时的请求&#xff0c;从而获取服务器当前的请求处理能力&#xff08;请求数/秒&#xff09;。以微信服务器为例&#xff0c;每个用户用独立的登录token&#xff0c;做各种操作&#xff0c;比如…

python中的常量是什么意思_第14p,Python中的常量与注释。

大家好&#xff0c;我是杨数Tos&#xff0c;这是《从零基础到大神》系列课程的第14篇文章&#xff0c;第二阶段的课程&#xff1a;Python基础知识&#xff1a;常量与注释。学习本课程&#xff0c;建议先看一遍&#xff1a;【计算机基础知识】课程。一、Python中的常量1、什么是…

07_JS函数

JS函数 函数声明 使用构造函数 var fun new Function();使用关键字 function 函数名(形参){// 函数体 }匿名函数 var fun1 function(){name "fun1" }函数参数 实参&#xff0c;形参都可以是任意数据类型&#xff0c;浏览器执行时不会检查实参类型和数量&…

cocoapods的安装(这真是一个神奇的东西,每次安装的方法都不一样,而且很容易出现各种各样的错误)...

文章开始之前&#xff0c;建议安装一个显示网速的插件&#xff0c;不然你不知道到底有没有下载&#xff0c;也让生活有一点盼头 1.因为众所周知的原因&#xff08;我dang的行为真的是让人失望&#xff09;&#xff0c;先更换一下ruby镜像源 $ gem sources --remove https://rub…

转】MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码

原博文出自于&#xff1a;http://www.cnblogs.com/xdp-gacl/p/3496161.html        感谢&#xff01; 在MyEclispe中创建Jsp页面&#xff0c;Jsp页面的默认编码是“ISO-8859-1”&#xff0c;如下图所示&#xff1a; 在这种编码下编写中文是没有办法保存Jsp页面的&#…

sum怎么用python_python sum()函数和.sum(axis=0)函数的使用

参考&#xff1a;《Machine Learning in Action》第二章#####################################################################sum函数&#xff1a;sum()函数是内建函数help(sum)函数功能&#xff1a;返回一个数字序列(非字符串)的和&#xff0c;并加上参数start的值(默认为…

08_JS工厂方法和构造函数

工厂方法和构造函数 工厂方法 工厂方法用来批量产生对象 function CreatCar(name,prase){// new 一个对象var obj new Object();obj.name name;obj.parse prase;obj.print function(){console.log(this.name " : " this.parse)};// 返回对象return obj; };va…

华为机试题【10】-求数字基root

题目描述&#xff1a; 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入&#xff1a;输入任意一个或多个整数 输出&#xff1a;输出各位数字之和,直到和为个位数为止(输入异常,则返回-1)&#xff0c;多行&#xff0c;每行对应一个输入数据的结果。 样例…

国内开源镜像站

搜狐开源镜像站&#xff1a;http://mirrors.sohu.com/ 网易开源镜像站&#xff1a;http://mirrors.163.com/开源中国&#xff1a;http://mirrors.oschina.net/首都在线科技股份有限公司&#xff1a;http://mirrors.yun-idc.com/阿里云开源镜像&#xff1a;http://mirrors.aliyu…

python update skeleton 不自动_python编程笔记(1)-数据类型

断断续续学了一些&#xff0c;但是后边一直没有使用&#xff0c;就又忘记了。为了缩短学习周期&#xff0c;这次学习的方法&#xff1a;先学主要框架&#xff08;数据类型、条件、循环、函数、类、numpy、pandas、sklearn&#xff09;&#xff0c;后期直接看朋友code 实操了&am…

09_JS原型对象

原型对象 在构造函数中&#xff0c;同一类相同的方法可以直接写在构造函数里&#xff0c;但这样每实例化一个对象都会产生一个新的该方法&#xff0c;但其实这个方法都是一样的&#xff0c;这样会浪费大量空间&#xff0c;另外&#xff0c;可以将相同的方法写在构造函数外&…

[改善Java代码]非稳定排序推荐使用List

我们知道Set与List的最大区别就是Set中的元素不可以重复&#xff08;这个重复指的equals方法的返回值相等&#xff09;&#xff0c;其他方面则没有太大的区别了&#xff0c;在Set的实现类中有一个比较常用的类需要了解一下&#xff1a;TreeSet&#xff0c;该类实现了类默认排序…

如何访问另一台电脑的共享文件夹_如何远程控制另一台电脑

在工作中&#xff0c;我们时常需要远程控制一下另一台电脑&#xff0c;如果这两台计算机在局域网内可以通过远程桌面轻松实现&#xff0c;如果这两台计算机不在局域网内则通常需要借助第三方软件来实现。远程桌面使用分三步&#xff1a;1、被控制端要开启远程桌面功能&#xff…

10_JS数组

JS 数组 以索引为键的对象&#xff0c;性能高于对象 创建 new Array() var arr Array() for(var i 0;i<5;i){arr[i] i; };var arr Array(1,2,3,4,5,6)数组字面量 var arr [2,3,4,5,6,7,8];不同&#xff1a;传入一个整数时&#xff0c;new把这个数当作数组长度&…

微软Hololens学院教程- Holograms 101: Introduction with Device【微软教程已经更新,本文是老版本】...

这是老版本的教程&#xff0c;为了不耽误大家的时间&#xff0c;请直接看原文&#xff0c;本文仅供参考哦&#xff01;原文链接&#xff1a;https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/holograms_101 这篇文章将通过一个完整的实例来了解设备的核心特性&#…

python seaborn boxplot_python - 如何将文本框添加到Seaborn Boxplot? - 堆栈内存溢出

我试图在框图中插入一个文本框&#xff0c;但是出了点问题。 让我们先绘制箱线图&#xff1a;import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sbdf_data pd.read_hdf(data.h5, keyfdf_data)##print(df_data)fig, (ax1, ax2) plt.subplots(1,2,gridspe…

JS_11正则表达式和字符串方法

正则表达式和字符串方法 正则表达式 创建正则对象 构造函数字面量 匹配模式 i&#xff1a;忽略大小写m&#xff1a;多行匹配g&#xff1a;全局匹配 正则语法 正则作用/a/检查是否有a/a|b/检查是否有a或b{}量词&#xff0c;如{1,3}匹配1到3次&#xff0c;{m,}匹配m次以上…

qtableview点击行将整行数据传过去_可以实时获取数据的Database Asset插件

前言&#xff1a;Goby之前开放的插件入口点较少&#xff0c;大家只能在扫描前、扫描后执行事件&#xff0c;无法参与扫描过程中来。为实现更多场景的应用及提高扫描效率&#xff08;如&#xff1a;后台爆破子域名等&#xff09;&#xff0c;Goby开放了一些新的API&#xff1a;事…

git 笔记

版本库1.repository在一个合适的地方&#xff0c;创建一个空目录$ mkdir learngit$ cd learngit$ pwd/User/leon/learngitpwd命令用于显示当前的目录&#xff0c;在我的电脑上&#xff0c;这个仓库位于/user/michael/learngit2.git init 将当前目录变成git 可以管理的仓库。$ g…

github 开源 代码 学习 集合(转载)

一个支持多种item类型的recycleView依赖注入库 1.通过注解的方式方便的把ViewHolder注入到recycleView中。 2.去除findViewByID等冗余操作。 3.去除编写adapter那些冗余逻辑&#xff0c;只需要编写proxy和holder即可快速的实现淘宝首页那样复杂的页面。https://github.com/s94…