結果

問題 No.3344 Common Tangent Line
コンテスト
ユーザー 回転
提出日時 2025-11-13 23:13:37
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,550 ms / 3,000 ms
コード長 2,130 bytes
コンパイル時間 339 ms
コンパイル使用メモリ 82,020 KB
実行使用メモリ 78,880 KB
最終ジャッジ日時 2025-11-13 23:14:08
合計ジャッジ時間 29,373 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

# https://tjkendev.github.io/procon-library/python/geometry/circle_common_tangent_point.html
def common_tangent_lines(x1, y1, r1, x2, y2, r2):
    result = []
    xd = x2 - x1; yd = y2 - y1

    rr0 = xd**2 + yd**2
    if (r1 - r2)**2 <= rr0:
        cv = r1 - r2
        if rr0 == (r1 - r2)**2:
            bx = r1*cv*xd/rr0
            by = r1*cv*yd/rr0
            result.append([
                (x1 + bx, y1 + by),
                (x1 - yd + bx, y1 + xd + by),
            ])
        else:
            sv = (rr0 - cv**2)**.5
            px = (cv*xd - sv*yd); py = (sv*xd + cv*yd)
            result.append([
                (x1 + r1*px/rr0, y1 + r1*py/rr0),
                (x2 + r2*px/rr0, y2 + r2*py/rr0),
            ])
            qx = (cv*xd + sv*yd); qy = (-sv*xd + cv*yd)
            result.append([
                (x1 + r1*qx/rr0, y1 + r1*qy/rr0),
                (x2 + r2*qx/rr0, y2 + r2*qy/rr0),
            ])
    if (r1 + r2)**2 <= rr0:
        cv = r1 + r2
        if rr0 == (r1 + r2)**2:
            bx = r1*cv*xd/rr0
            by = r1*cv*yd/rr0
            result.append([
                (x1 + bx, y1 + by),
                (x1 - yd + bx, y1 + xd + by),
            ])
        else:
            sv = (rr0 - cv**2)**.5
            px = (cv*xd - sv*yd); py = (sv*xd + cv*yd)
            result.append([
                (x1 + r1*px/rr0, y1 + r1*py/rr0),
                (x2 - r2*px/rr0, y2 - r2*py/rr0),
            ])
            qx = (cv*xd + sv*yd); qy = (-sv*xd + cv*yd)
            result.append([
                (x1 + r1*qx/rr0, y1 + r1*qy/rr0),
                (x2 - r2*qx/rr0, y2 - r2*qy/rr0),
            ])
    return result

T = int(input())
for _ in range(T):
    x1, y1, r1 = map(int, input().split())
    x2, y2, r2 = map(int, input().split())
    
    result = sorted(common_tangent_lines(x1, y1, r1, x2, y2, r2))
    lines = []
    for (ax,ay),(bx,by) in result:
        a = by - ay
        b = -(bx - ax)
        c = -ax * by + bx * ay
        lines.append((a,b,c))

    ans = 0
    for a,b,c in lines:
        M = max(abs(a),abs(b),abs(c))
        ans += abs(a/M + b/M + c/M)
    print(ans)
0