Codeforces 832C - Strange Radiation

时间:2023-03-09 07:39:36
Codeforces 832C - Strange Radiation

832C - Strange Radiation

思路:二分最短时间。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define pi acos(-1.0)
#define pii pair<int,int>
#define pil pair<int,long>
#define mem(a,b) mamset(a,b,sizeof(a)) const int MOD=1e9+;
const int INF=0x3f3f3f3f;
const int N=1e5+;
const double eps=1e-; int n;
double s; struct people
{
double x,v,t;
}a[N]; bool check(double t)
{
bool flag1=false,flag2=false;
double l_l=1e6,l_r=,r_l=1e6,r_r=;
for(int i=;i<n;i++)
{
if(a[i].t==)
{
if(a[i].x-(a[i].v+s)*t>)continue;//如果炸弹放在这个点上都到不了,说明这个人肯定到不了。
flag1=true;
if(a[i].x-a[i].v*t<=)//如果不加速也能到,那说明炸弹放在哪里都可以。
{
l_l=;
l_r=1e6;
continue;
}
double X=floor((t*(s*s-a[i].v*a[i].v)+a[i].x*a[i].v)/s);
l_r=max(l_r,X);//取并集
l_l=min(l_l,(double)a[i].x);
}
else if(a[i].t==)
{
if(a[i].x+(a[i].v+s)*t<1e6)continue;
flag2=true;
if(a[i].x+a[i].v*t>=1e6)
{
r_l=;
r_r=1e6;
continue;
}
double X=ceil((1e6*(s-a[i].v)-t*(s*s-a[i].v*a[i].v)+a[i].x*a[i].v)/s);
r_l=min(r_l,X);
r_r=max(r_r,(double)a[i].x);
}
}
if(!flag1||!flag2)return false;
if(l_l>l_r||r_l>r_r)return false;
if(l_r<r_l||r_r<l_l)return false;//取交集
return true;
} int main()
{
scanf("%d%lf",&n,&s);
for(int i=;i<n;i++)
scanf("%lf%lf%lf",&a[i].x,&a[i].v,&a[i].t); double l=,r=1e6+;
double mid=(l+r)/;
while(r-l>=eps)
{
if(check(mid))r=mid;
else l=mid;
mid=(l+r)/;
}
printf("%.12lf\n",mid);
return ;
}