結果
| 問題 |
No.3344 Common Tangent Line
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
ソースコード
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)