BZOJ4077 : [Wf2014]Messenger
二分答案,让$A$推迟出发$mid$的时间。
对于每个相邻的时间区间,两个点都是做匀速直线运动。
以$A$为参照物,那么$A$不动,$B$作匀速直线运动。
若线段$B$到$A$的距离不超过$mid$,则可行。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=50010;
const double eps=1e-9;
inline int sgn(double x){
if(x<-eps)return -1;
if(x>eps)return 1;
return 0;
}
int n,m,i;double l,r,mid,f[N],da[N],db[N];
struct P{
double x,y;
P(){}
P(double _x,double _y){x=_x,y=_y;}
P operator+(const P&b){return P(x+b.x,y+b.y);}
P operator-(const P&b){return P(x-b.x,y-b.y);}
P operator*(double b){return P(x*b,y*b);}
P operator/(double b){return P(x/b,y/b);}
double operator*(const P&b){return x*b.x+y*b.y;}
double len(){return hypot(x,y);}
void read(){scanf("%lf%lf",&x,&y);}
}a[N],b[N];
inline double cross(P a,P b){return a.x*b.y-a.y*b.x;}
inline P lerp(P a,P b,double t){return a*(1.0-t)+b*t;}
inline double dist_point_to_segment(P p,P a,P b){
if((b-a).len()>eps&&sgn((p-a)*(b-a))>=0&&sgn((p-b)*(a-b))>=0)return fabs(cross(p-a,b-a))/(b-a).len();
return min((p-a).len(),(p-b).len());
}
inline double cal(P A,P B,P C,P D,double t){
B=B-A;
B=B/B.len();
D=D-C;
D=D/D.len();
D=D-B;
return dist_point_to_segment(A,C,C+D*t);
}
bool check(double mid){
int i=1,j;
P A=a[1],B;
double v=0,w;
for(j=1;j<m;j++)if(mid<f[j]){
w=mid-f[j-1];
B=lerp(b[j],b[j+1],w/db[j]);
break;
}
if(j==m)return 1;
while(i<n&&j<m){
double x=(A-a[i+1]).len(),y=(B-b[j+1]).len();
if((A-B).len()<mid+eps)return 1;
if(x>eps&&y>eps)if(cal(A,a[i+1],B,b[j+1],min(x,y))<mid+eps)return 1;
if(!sgn(x-y)){
A=a[++i];
B=b[++j];
v=w=0;
continue;
}
if(x<y){
A=a[++i];
v=0;
w+=x;
B=lerp(b[j],b[j+1],w/db[j]);
continue;
}
v+=y;
A=lerp(a[i],a[i+1],v/da[i]);
B=b[++j];
w=0;
}
return 0;
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)a[i].read();
scanf("%d",&m);
for(i=1;i<=m;i++)b[i].read();
for(i=1;i<n;i++)da[i]=(a[i]-a[i+1]).len();
for(i=1;i<m;i++)db[i]=(b[i]-b[i+1]).len();
for(i=1;i<m;i++)f[i]=f[i-1]+db[i];
r=f[m-1];
if((a[1]-b[m]).len()>r+eps)return puts("impossible"),0;
for(i=40;i;i--)if(check(mid=(l+r)/2))r=mid;else l=mid;
return printf("%.8f",(l+r)/2),0;
}
BZOJ4077 : [Wf2014]Messenger的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- android:使用Messenger进行进程间通信(一)
Messenger简介 Messenger和AIDL是实现进程间通信(interprocess communication)的两种方式. 实际上,Messenger的实现其实是对AIDL的封装. Me ...
- Android进程间通讯之messenger
这两天在看binder,无意间在文档看到messenger这么个东西,感觉这个东西还挺有意思的,给大家分享一下. 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都 ...
- android 史上最简单易懂的跨进程通讯(Messenger)!
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
- android:使用Messenger进行进程间通信(二)
//继续完善音乐播放器demo 相关文章: android:使用Messenger进行进程间通信(一):http://www.cnblogs.com/happyhacking/p/5318418.ht ...
- How secure FB Messenger is?
It's reported that FB Messenge is the most secure App for instant messaging service. Let's see if FB ...
- Android进程间的通信之Messenger
Android进程间的通信方式可以通过以下两种方式完成: Android接口定义语言(AIDL) 使用Messenger绑定服务 本文我们将学习使用Messenger绑定服务的方式进行进程间的通信. ...
- Android IPC机制之Messenger
Messenger:两个进程通过Messenger传递消息,进程1和进程2中都需要创建一个Messenger,创建过程:首先进程2需要创建一个服务, 并在服务中创建一个Messenger对象,进程1通 ...
- Messenger
Messenger Mvvm提倡View和ViewModel的分离,View只负责数据的显示,业务逻辑都尽可能放到ViewModel中, 保持View.xaml.cs中的简洁(没有任何代码,除了构造函 ...
随机推荐
- 论文阅读笔记十一:Rethinking Atrous Convolution for Semantic Image Segmentation(DeepLabv3)(CVPR2017)
论文链接:https://blog.csdn.net/qq_34889607/article/details/8053642 摘要 该文重新窥探空洞卷积的神秘,在语义分割领域,空洞卷积是调整卷积核感受 ...
- iptables-snat-dnat-设置
nat internet iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j SNAT --to-source ...
- 理解DeepBox算法
理解DeepBox算法 基本情况 论文发表在ICCV2015,作者是Berkeley的博士生Weicheng Kuo: @inproceedings{KuoICCV15DeepBox, Author ...
- 网络通信socket连接数上限
socket accept()返回的socket描述符的端口和listen描述符端口是一样的吗? as you know,一个socket是由一个五元组来唯一标示的,即(协议,server_ip, s ...
- 来一个使用sysbench测试cpu性能的简单脚本
#!/bin/bash for ((i=1; i<16; i++)); do sysbench cpu run --cpu-max-prime=10000 --threads=4 --time= ...
- Linux环境安装Eclipse工具开发
1.官网下载maven:https://maven.apache.org/download.cgi 2.上传到虚拟机进行解压缩操作: [hadoop@slaver1 package]$ tar -zx ...
- [转] js中的钩子机制(hook)
什么是钩子机制?使用钩子机制有什么好处? 钩子机制也叫hook机制,或者你可以把它理解成一种匹配机制,就是我们在代码中设置一些钩子,然后程序执行时自动去匹配这些钩子:这样做的好处就是提高了程序的执行效 ...
- spring cloud (二、服务注册安全demo_eureka)
spring cloud (一.服务注册demo_eureka) 加强服务的安全性,我们接下来加上访问的账号密码: 首先需要添加对应的依赖 <!--账号密码认证依赖--> <depe ...
- 067 HA与updateStateByKey结合
是HA与updateStateByKey相结合的程序. 有点问题,有点奇怪,重启项目后运行没有问题,但是第三次启动的时候,就不会在打印数据了,有点问题. 1.程序 package com.stream ...
- miniui中可以设置是否让页面进行分页 <div id="datagrid1" class="mini-datagrid" style="width:100%" allowAlternating="true" showpager="true"/> 就是设置showpager属性为true
<div id="datagrid1" class="mini-datagrid" style="width:100%" allowA ...