結果

問題 No.3344 Common Tangent Line
コンテスト
ユーザー tassei903
提出日時 2025-10-29 13:51:51
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 820 ms / 3,000 ms
コード長 2,687 bytes
コンパイル時間 562 ms
コンパイル使用メモリ 82,636 KB
実行使用メモリ 79,104 KB
最終ジャッジ日時 2025-11-13 21:02:52
合計ジャッジ時間 17,362 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

from builtins import len
import sys
input = lambda :sys.stdin.readline()[:-1]
ni = lambda :int(input())
na = lambda :list(map(int,input().split()))
yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES")
no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO")
#######################################################################
from math import sqrt

for _ in range(ni()):
    x1, y1, r1 = map(int, input().split())
    x2, y2, r2 = map(int, input().split())
    
    
    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

    result = sorted(common_tangent_lines(x1, y1, r1, x2, y2, r2))
    ans = 0
    for (p1, p2) in result:
        # 二点を通る直線の方程式 Ax + By + C = 0 の A, B, C を求める
        A = p2[1] - p1[1]
        B = p1[0] - p2[0]
        C = p2[0] * p1[1] - p1[0] * p2[1]
        z = max(abs(A), abs(B), abs(C))
        A /= z
        B /= z
        C /= z
        ans += abs(A + B + C)

    print(ans)
0