結果
| 問題 |
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 |
ソースコード
# 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)
回転