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中的简洁(没有任何代码,除了构造函 ...
随机推荐
- https请求抛出异常
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;// SecurityProtocolType.Tls1.2;
- 饮冰三年-人工智能-Python-13Python基础之运算符与数据类型
1:算数运算符 + - * / ** % // 2: 成员运算符 in not in name = """张三""" if "张& ...
- IDEA中每次拷贝一个项目的时候必须标记一下配置文件resources,否则报错
- fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
fg.bg.jobs.&.nohup.ctrl+z.ctrl+c 命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如 watch -n 10 sh test.sh &am ...
- 函数函数sigaction、signal
函数函数sigaction 1. 函数sigaction原型: int sigaction(int signum, const struct sigaction *act, struct sigact ...
- office web apps搭建与解决方案
微软office在线预览解决方案https://view.officeapps.live.com/op/view.aspx?src=http://storage.xuetangx.com/public ...
- SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问
SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672
- mariadb-半同步复制
半同步复制: 使用插件 对于从节点,有一部分为同步复制,当主节点复制完从节点后才向客户返回ok,同步超时后自动降级为异步 有一部分为异步复制 这样为了与主节点冗余 基于主从的模式上搭建 半同步复制: ...
- Flask---第一个例子--使用Flask写的【Hello World !】的web程序
from flask import Flask;------->引入Flask插件,pip install Flask; app=Flask(__name__) #变量app是Flask的一个实 ...
- BZOJ3437 小P的牧场 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8696321.html 题目传送门 - BZOJ3437 题意 给定两个序列$a,b$,现在划分$a$序列. 被划 ...