Submission #69871435


Source Code Expand

#include <bits/stdc++.h>
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 0
#endif
using namespace std;
using ll = long long;
using db = double;
const ll N = 1e6 + 5;
const ll md = 998244353;
const ll MOD = 1e9 + 7;
const ll INF = 0x3f3f3f3f3f3f3f;
const db PI = acos(-1);
const db eps = 1e-6;
const db E = 2.718281828459045;
typedef pair<ll, ll> PLL;
#define fi first
#define se second
db sx1, sx2, sy1, sy2, ex1, ex2, ey1, ey2;
db a1, b1, a2, b2, c1, d1, c2, d2;
db dis(db x1, db y1, db x2, db y2)
{
    db res = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
    return res;
}
db z1, z2;
db cal(db t)
{
    if (t < 0)
        return 1e9;
    sx1 = a1, sy1 = b1, ex1 = c1, ey1 = d1;
    sx2 = a2, sy2 = b2, ex2 = c2, ey2 = d2;
    db xx1 = (ex1 - sx1);
    db yy1 = (ey1 - sy1);
    db xx2 = (ex2 - sx2);
    db yy2 = (ey2 - sy2);
    db res1 = sqrtl(dis(sx1, sy1, ex1, ey1));
    db res2 = sqrtl(dis(sx2, sy2, ex2, ey2));
    z1 = min(res1, res2), z2 = max(res1, res2);
    if (t > min(res1, res2))
        return 1e9;
    sx1 += xx1 / res1 * t;
    sy1 += yy1 / res1 * t;
    sx2 += xx2 / res2 * t;
    sy2 += yy2 / res2 * t;
    // cout << sx1 << ' ' << sy1 << '\n';
    if (t > res1)
        sx1 = ex1, sy1 = ey1;
    if (t > res2)
        sx2 = ex2, sy2 = ey2;
    return dis(sx1, sy1, sx2, sy2);
}
db cal2(db t)
{
    sx1 = a1, sy1 = b1, ex1 = c1, ey1 = d1;
    sx2 = a2, sy2 = b2, ex2 = c2, ey2 = d2;
    db xx1 = (ex1 - sx1);
    db yy1 = (ey1 - sy1);
    db xx2 = (ex2 - sx2);
    db yy2 = (ey2 - sy2);
    db res1 = sqrtl(dis(sx1, sy1, ex1, ey1));
    db res2 = sqrtl(dis(sx2, sy2, ex2, ey2));
    sx1 += xx1 / res1 * t;
    sy1 += yy1 / res1 * t;
    sx2 += xx2 / res2 * t;
    sy2 += yy2 / res2 * t;
    // cout << sx1 << ' ' << sy1 << '\n';
    if (t > res1)
        sx1 = ex1, sy1 = ey1;
    if (t > res2)
        sx2 = ex2, sy2 = ey2;
    return dis(sx1, sy1, sx2, sy2);
}
void solve()
{
    cin >> a1 >> b1 >> c1 >> d1;
    cin >> a2 >> b2 >> c2 >> d2;
    db l = 0, r = 1e9;
    for (int i = 0; i < 300; i++)
    {
        db lmid = l + (r - l) / 3;
        db rmid = r - (r - l) / 3;
        if (cal(rmid) >= cal(lmid))
            r = rmid;
        else
            l = lmid;
    }
    db ans = sqrtl(cal(l));
    l = z1, r = z2;
    for (int i = 0; i < 300; i++)
    {
        db lmid = l + (r - l) / 3;
        db rmid = r - (r - l) / 3;
        if (cal2(rmid) >= cal2(lmid))
            r = rmid;
        else
            l = lmid;
    }
    db res = sqrtl(cal2(l));
    ans = min(ans, res);
    cout << fixed << setprecision(15) << ans << '\n';
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T;
    T = 1;
    cin >> T;
    while (T--)
    {
        solve();
    }
}

Submission Info

Submission Time
Task E - Closest Moment
User AChievedreaM
Language C++ 20 (gcc 12.2)
Score 450
Code Size 2840 Byte
Status AC
Exec Time 2771 ms
Memory 4252 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 450 / 450
Status
AC × 1
AC × 11
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 02_large_00.txt, 02_large_01.txt, 02_large_02.txt, 02_large_03.txt, 02_large_04.txt, 02_large_05.txt, 02_large_06.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3752 KiB
01_small_00.txt AC 2606 ms 3968 KiB
01_small_01.txt AC 2079 ms 3680 KiB
01_small_02.txt AC 2587 ms 4036 KiB
02_large_00.txt AC 2770 ms 4188 KiB
02_large_01.txt AC 2769 ms 4220 KiB
02_large_02.txt AC 2769 ms 4192 KiB
02_large_03.txt AC 2769 ms 4208 KiB
02_large_04.txt AC 2771 ms 4236 KiB
02_large_05.txt AC 2769 ms 4252 KiB
02_large_06.txt AC 72 ms 3684 KiB