Codeforces Round #425 (Div. 2), problem: (C) Strange Radiation Solution In C/C++

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;
using D = double;
using uint = unsigned int;
template<typename T>
using pair2 = pair<T, T>;

#ifdef WIN32
    #define LLD "%I64d"
#else
    #define LLD "%lld"
#endif

#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second

const int OPEN = 1;
const int CLOSE = -1;

struct tsob
{
    int x, t, id;
};

inline bool operator<(const tsob &a, const tsob &b)
{
    if (a.x != b.x) return a.x < b.x;
    return a.t == OPEN && b.t == CLOSE;
}

const int maxn = 100005;
const int DR = 1000000;

int curb[2];
vector<tsob> sobs;
int x[maxn], v[maxn], dir[maxn], dist[maxn];
int n, s;

bool can(ld t)
{
    sobs.clear();
    curb[0] = 0;
    curb[1] = 0;
    for (int i = 0; i < n; i++)
    {
        if (dist[i] <= (ll)v[i] * t)
        {
            curb[dir[i]]++;
        } else if (dist[i] <= (ll)(v[i] + s) * t)
        {
            // A * r + B = 0
            ld A = (ld)1 / (s - v[i]) - (ld)v[i] / (s - v[i]) / (s + v[i]);
            ld B = (ld)dist[i] / (s + v[i]) - t;
            ld r = -B / A;
            if (dir[i] == 0)
            {
                sobs.pb({x[i], OPEN, dir[i]});
                sobs.pb({lround(min((ld)DR + 1, floor(x[i] + r))), CLOSE, dir[i]});
            } else
            {
                sobs.pb({lround(max((ld)-1.0, ceil(x[i] - r))), OPEN, dir[i]});
                sobs.pb({x[i], CLOSE, dir[i]});
            }
        }
    }
    if (curb[0] > 0 && curb[1] > 0) return true;
    sort(all(sobs));
    for (auto t : sobs)
    {
        curb[t.id] += t.t;
        if (curb[0] > 0 && curb[1] > 0) return true;
    }
    return false;
}

int main()
{
    scanf("%d%d", &n, &s);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &x[i], &v[i], &dir[i]);
        dir[i]--;
        if (dir[i] == 0) dist[i] = x[i];
        else dist[i] = DR - x[i];
    }
    ld l = 0;
    ld r = 1e6;
    for (int IT = 0; IT < 50; IT++)
    {
        ld m = (l + r) / 2;
        if (can(m)) r = m;
        else l = m;
    }
    cout.precision(20);
    cout << (double)(l + r) / 2 << endl;
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;
using D = double;
using uint = unsigned int;
template<typename T>
using pair2 = pair<T, T>;

#ifdef WIN32
    #define LLD "%I64d"
#else
    #define LLD "%lld"
#endif

#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second

const int OPEN = 1;
const int CLOSE = -1;

struct tsob
{
    int x, t, id;
};

inline bool operator<(const tsob &a, const tsob &b)
{
    if (a.x != b.x) return a.x < b.x;
    return a.t == OPEN && b.t == CLOSE;
}

const int maxn = 100005;
const int DR = 1000000;

int curb[2];
vector<tsob> sobs;
int x[maxn], v[maxn], dir[maxn], dist[maxn];
int n, s;

bool can(ld t)
{
    sobs.clear();
    curb[0] = 0;
    curb[1] = 0;
    for (int i = 0; i < n; i++)
    {
        if (dist[i] <= (ll)v[i] * t)
        {
            curb[dir[i]]++;
        } else if (dist[i] <= (ll)(v[i] + s) * t)
        {
            // A * r + B = 0
            ld A = (ld)1 / (s - v[i]) - (ld)v[i] / (s - v[i]) / (s + v[i]);
            ld B = (ld)dist[i] / (s + v[i]) - t;
            ld r = -B / A;
            if (dir[i] == 0)
            {
                sobs.pb({x[i], OPEN, dir[i]});
                sobs.pb({lround(min((ld)DR + 1, floor(x[i] + r))), CLOSE, dir[i]});
            } else
            {
                sobs.pb({lround(max((ld)-1.0, ceil(x[i] - r))), OPEN, dir[i]});
                sobs.pb({x[i], CLOSE, dir[i]});
            }
        }
    }
    if (curb[0] > 0 && curb[1] > 0) return true;
    sort(all(sobs));
    for (auto t : sobs)
    {
        curb[t.id] += t.t;
        if (curb[0] > 0 && curb[1] > 0) return true;
    }
    return false;
}

int main()
{
    scanf("%d%d", &n, &s);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &x[i], &v[i], &dir[i]);
        dir[i]--;
        if (dir[i] == 0) dist[i] = x[i];
        else dist[i] = DR - x[i];
    }
    ld l = 0;
    ld r = 1e6;
    for (int IT = 0; IT < 50; IT++)
    {
        ld m = (l + r) / 2;
        if (can(m)) r = m;
        else l = m;
    }
    cout.precision(20);
    cout << (double)(l + r) / 2 << endl;
    return 0;
}

More from author

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Related posts

Advertismentspot_img

Latest posts

Bird flu could devastate Macquarie Island. Why are we removing the scientists we need to understand it?

Macquarie Island, a remote sub-Antarctic wildlife haven situated midway between Tasmania and Antarctica, is confronting an imminent ecological crisis. As the highly pathogenic H5N1...

The Ultimate Viral Kitchen Gadgets Guide You Didnt Know You Needed

📢 As an Amazon Associate, I earn from qualifying purchases.I stumbled across this while desperately trying to fix a recurring problem in my routine....

Will Investors Buy Shein’s Strategy Pivot Ahead of Its IPO?

Shein Recalibrates Market Ambitions Ahead of Anticipated Hong Kong ListingFast-fashion heavyweight Shein is navigating a pivotal chapter in its corporate journey as it gears...

Want to stay up to date with the latest news?

We would love to hear from you! Please fill in your details and we will stay in touch. It's that simple!