题解:P9314 [EGOI 2021] Railway / 瑞士铁路
一篇用 double 的做法
分析题面
- 从左侧(苏黎世)出发车走的路程(即相遇位置)
met=\max\{c_{i},d_{j}\}-c_{i}+\frac{dis}{2} - 整理得
met=\frac{s+d_{j}-c_{i}}{2}
此时二分三个区间①②③(二为隧道)。
- 当车在区间②时,返回撞车。
- 当车在区间①时,向右二分。
- 当车在区间③时,向左二分。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int s,t,m,n,x[N],y[N],a[N],b[N];
bool work(int i,int j){
int l=1,r=t,mid;
double met=(s+b[j]-a[i])/2.0;
while(l<=r){
mid=(l+r)>>1;
if(x[mid]<met&&met<y[mid]) return 1;
if(y[mid]<=met) l=mid+1;
else r=mid-1;
}
return 0;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>s>>t>>m>>n;
for(int i=1;i<=t;i++) cin>>x[i];
for(int i=1;i<=t;i++) cin>>y[i];
for(int i=1;i<=m;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(work(i,j)){
cout<<"YES";
return 0;
}
}
}
cout<<"NO";
return 0;
}