832C Codeforces. Излучение странно 二 分

портал

Смысл проблем

В интервале \ ([^ 6 0,10] \) существует \ (п \) личные, каждый человек имеет позицию на старт, направлении и скорости \ (V_i \) , движение в направлении лица,
вы можете положить бомба в интервале в произвольном целочисленноге положения, после запуска бомбы взорвалась скорость с обоего сторон была \ (s \) волна
за волной и тот же человек в контакт с переломом скорости волны \ (v_i + s \)
, сколько просить по крайней мере , есть люди вокруг интервала времени после прибытия.

мышление

Этот минимальный юридический отвечать на вопросы должны идти на половину думаю ,
если известно время \ (т \) , вопрос заключается в том , чтобы проверить его законность
может первым принять решение о направлении, то для каждого человека в этом направлении, если он вычислил хочет \ (т \) в пределах досягаемости границы,
бомба должна быть помещена в положении, это положение явно интервал, а затем найти соответствующий раздел каждого человека и установить один и
тот же путь в обратном направлении , чтобы получить соответствующие бомбы может быть размещена в промежутке ,
если это два интервала пересекаются, то \ (т \) на легитимной, о
том , как рассчитать каждый из соответствующего интервала, он может вычислить только перо

код

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
const int MAXM=1e6+10;
const int L=1e6;
int n,s,suml[MAXM],sumr[MAXM];
struct Person{
    int x,v,dir;
}p[MAXN];

bool check(double t){
    memset(suml,0,sizeof(suml));
    memset(sumr,0,sizeof(sumr));
    for(int i=1;i<=n;i++){
        int x=p[i].x,v=p[i].v,dir=p[i].dir;
        if(dir==1){
            if(t*v>=x+1e-8) {suml[0]++;continue;}
            if(t*(s+v)<x-1e-8) continue;
            double dis=(t*(s-v)*(s+v)+1.0*v*x-1.0*s*x)/s;
            suml[x]++;suml[min((int)dis+x,L)+1]--;
        }
        else{
            if(t*v>=L-x+1e-8) {sumr[0]++;continue;}
            if(t*(s+v)<L-x-1e-8) continue;
            double dis=(t*(s-v)*(s+v)+1.0*(L-x)*(v-s))/s;
            sumr[max(x-(int)dis,0)]++;sumr[x+1]--;
        }
    }
    for(int i=1;i<=1e6;i++) suml[i]+=suml[i-1],sumr[i]+=sumr[i-1];
    for(int i=0;i<=1e6;i++) if(suml[i]&&sumr[i]) return true;
    return false;
}

int main(){
    scanf("%d%d",&n,&s);
    for(int i=1;i<=n;i++)
        scanf("%d%d%d",&p[i].x,&p[i].v,&p[i].dir);
    double l=0,r=1e6;
    while(r-l>1e-8){
        double mid=(r+l)/2;
        if(check(mid)) r=mid;
        else l=mid;
    }
    printf("%.7lf",l);
    return 0;
}

рекомендация

отwww.cnblogs.com/BakaCirno/p/12164544.html