結果

問題 No.2602 Real Collider
ユーザー strangerxxx
提出日時 2024-05-01 18:17:22
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 6,889 bytes
コンパイル時間 192 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 85,024 KB
最終ジャッジ日時 2024-11-21 23:58:19
合計ジャッジ時間 55,455 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 4 WA * 74
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import math
def resolve():
import sys
input = sys.stdin.readline
q = int(input())
xa, ya, xb, yb, xc, yc = map(int, input().split())
if islinear((xa, ya), (xb, yb), (xc, yc)):
x = (xa, ya)
y = (xb, yb)
z = (xc, yc)
d = (
distance(x, y),
distance(y, z),
distance(z, x),
)
mx = max(d)
if d[0] == mx:
c = center(x, y)
d = distance(x, c)
elif d[1] == mx:
c = center(y, z)
d = distance(y, c)
else:
c = center(z, x)
d = distance(z, c)
else:
for x, y, z in (
((xa, ya), (xb, yb), (xc, yc)),
((xb, yb), (xc, yc), (xa, ya)),
((xc, yc), (xa, ya), (xb, yb)),
):
if distance(x, y) >= distance(y, z) + distance(z, x):
c = center(x, y)
d = Fraction(distance(x, y), 2)
break
else:
c = circumcenter2((xa, ya), (xb, yb), (xc, yc))
d = distance(c, (xa, ya))
for _ in range(q):
x, y = map(int, input().split())
print("Yes" if distance(c, (x, y)) <= d**2 else "No")
class Fraction:
def __init__(self, a: int = 0, b: int = 1) -> None:
if isinstance(a, Fraction):
self.a, self.b = a.a, a.b
return
a, b = int(a), int(b)
if b == 0:
raise ZeroDivisionError(f"{a}/{b}")
if b < 0:
a, b = -a, -b
self.a, self.b = a, b
self._reducion()
def _reducion(self):
g = math.gcd(self.a, self.b)
self.a //= g
self.b //= g
def __add__(self, other):
if isinstance(other, Fraction):
g = math.gcd(self.b, other.b)
x = other.b // g * self.a
y = self.b // g * other.a
return Fraction(x + y, self.b // g * other.b)
return Fraction(self.a + other * self.b, self.b)
def __iadd__(self, other):
if isinstance(other, Fraction):
g = math.gcd(self.b, other.b)
self.a *= other.b // g
self.a += self.b // g * other.a
self.b *= other.b // g
else:
self.a += other * self.b
self._reducion()
return self
__radd__ = __add__
def __sub__(self, other):
if isinstance(other, Fraction):
return self.__add__(-other)
return self.__add__(-other)
def __isub__(self, other):
if isinstance(other, Fraction):
return self.__iadd__(-other.a, other.b)
return self.__iadd__(-other)
def __rsub__(self, other):
return -self + other
def __mul__(self, other):
if isinstance(other, Fraction):
return Fraction(self.a * other.a, self.b * other.b)
else:
return Fraction(self.a * other, self.b)
def __imul__(self, other):
if isinstance(other, Fraction):
self.a *= other.a
self.b *= other.b
else:
self.a *= other
self._reducion()
return self
__rmul__ = __mul__
def __floordiv__(self, other):
if isinstance(other, Fraction):
return self.__mul__(other.inverse())
return Fraction(self.a, self.b * other)
def __ifloordiv__(self, other):
if isinstance(other, Fraction):
return self.__imul__(other.inverse())
self.b *= other
self._reducion()
return self
def __rfloordiv__(self, other):
return self.inverse() * other
__truediv__ = __floordiv__
__itruediv__ = __ifloordiv__
__rtruediv__ = __rfloordiv__
def __pow__(self, other):
if isinstance(other, Fraction):
if other.b == 1:
return self.__pow__(other.a)
raise NotImplementedError
return Fraction(self.a**other, self.b**other)
def __ipow__(self, other):
if isinstance(other, Fraction):
if other.b == 1:
return self.__ipow__(other.a)
raise NotImplementedError
self.a **= other
self.b **= other
return self
def __rpow__(self, other):
if self.b != 1:
raise NotImplementedError
return other**self.a
def __floor__(self) -> int:
return self.a // self.b
def __ceil__(self) -> int:
return (self.a + self.b - 1) // self.b
__int__ = __floor__
def __float__(self):
return self.a / self.b
def inverse(self):
if self.a == 0:
raise ZeroDivisionError(f"tring to calcuate inverse of {self.a}/{self.b}")
return Fraction(self.b, self.a)
def __pos__(self):
return Fraction(self.a, self.b)
def __neg__(self):
return Fraction(-self.a, self.b)
def __abs__(self):
return Fraction(abs(self.a), self.b)
def __eq__(self, other) -> bool:
if isinstance(other, Fraction):
return self.a == other.a and self.b == other.b
return self.a == self.b * other
def __gt__(self, other):
if isinstance(other, Fraction):
return self.a * other.b > other.a * self.b
return self.a > self.b * other
def __ge__(self, other):
if isinstance(other, Fraction):
return self.a * other.b >= other.a * self.b
return self.a >= self.b * other
def __lt__(self, other):
if isinstance(other, Fraction):
return self.a * other.b < other.a * self.b
return self.a < self.b * other
def __le__(self, other):
if isinstance(other, Fraction):
return self.a * other.b <= other.a * self.b
return self.a <= self.b * other
def __str__(self) -> str:
return f"{self.a}/{self.b}"
__repr__ = __str__
def __hash__(self) -> int:
return hash(self.__str__())
def distance(pa, pb):
return sum([(i - j) ** 2 for i, j in zip(pa, pb)])
def islinear(pa, pb, pc):
return (pa[0] - pb[0]) * (pa[1] - pc[1]) == (pa[0] - pc[0]) * (pa[1] - pb[1])
def center(x, y):
return (Fraction((x[0] + y[0]), 2), Fraction((x[1] + y[1]), 2))
def circumcenter2(pa, pb, pc):
#
x0 = (
(pa[0] ** 2 + pa[1] ** 2) * (pb[1] - pc[1])
+ (pb[0] ** 2 + pb[1] ** 2) * (pc[1] - pa[1])
+ (pc[0] ** 2 + pc[1] ** 2) * (pa[1] - pb[1])
)
y0 = 2 * ((pb[1] - pc[1]) * (pa[0] - pb[0]) - (pa[1] - pb[1]) * (pb[0] - pc[0]))
x1 = (
(pa[0] ** 2 + pa[1] ** 2) * (pb[0] - pc[0])
+ (pb[0] ** 2 + pb[1] ** 2) * (pc[0] - pa[0])
+ (pc[0] ** 2 + pc[1] ** 2) * (pa[0] - pb[0])
)
y1 = 2 * ((pb[0] - pc[0]) * (pa[1] - pb[1]) - (pa[0] - pb[0]) * (pb[1] - pc[1]))
return (
Fraction(x0, y0) if y0 else 0,
Fraction(x1, y1) if y1 else 0,
)
if __name__ == "__main__":
resolve()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0