結果
| 問題 | No.3154 convex polygon judge | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-05-20 21:41:21 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1,270 ms / 2,000 ms | 
| コード長 | 3,094 bytes | 
| コンパイル時間 | 386 ms | 
| コンパイル使用メモリ | 82,264 KB | 
| 実行使用メモリ | 118,616 KB | 
| 最終ジャッジ日時 | 2025-05-20 21:41:38 | 
| 合計ジャッジ時間 | 9,194 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 44 | 
ソースコード
import math
# Const
INF = int(1e9)
EPS = 1e-12
# Equation and Formula
def Equation(A, B, C):
    # Solve Ax^2 + Bx + C = 0
    if A == 0 and B == 0: return None, None
    if A == 0: return -C/B, -C/B
    D = B*B - 4*A*C
    if D < 0: return None, None
    X = (-B-D**.5)/(2*A)
    Y = (-B+D**.5)/(2*A)
    return min(X, Y), max(X, Y)
def dot3(O, A, B):
    return (A - O)*(B - O)
def cross3(O, A, B):
    return (A - O)@(B - O)
def abs2(A, B):
    C = A - B
    return C.x**2 + C.y**2
# Geometry Class
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    # Comparison Operator
    def __lt__(self, other):
        if self.x == other.x: return self.y < other.y
        return self.x < other.x
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    def __le__(self, other):
        return self.__lt__(self, other) or self.__eq__(self, other)
    # Operator Function
    def __neg__(self):
        return self.__class__(-self.x, -self.y)
    def __add__(self, other):
        return self.__class__(self.x + other.x, self.y + other.y)
    def __sub__(self, other):
        return self.__add__(-other)
    
    def __mul__(self, other):
        # vector(x, y) dot
        return self.x*other.x + self.y*other.y
    def __matmul__(self, other):
        # vector(x, y) cross
        return self.x*other.y - other.x*self.y
    # Absolute
    def __abs__(self):
        return (self.x**2+self.y**2)**.5
    
    # To_string
    def __str__(self):
        return f"({self.x}, {self.y})"
    
    __repr__ = __str__
    # Iterator
    def __iter__(self):
        return iter([self.x, self.y])
class Circle:
    def __init__(self, p, r):
        assert r > 0
        self.p = p
        self.r = r
        # (p.x-x)^2 + (p.y-y)^2 == r^2
    def inside(self, C):
        return abs2(self.p, C) <= self.r**2 + EPS
    
    def __str__(self):
        return f"Circle[center={self.p}, radius={self.r}]"
    __repr__ = __str__
# Geomery Library
def line_cross_point(L0, L1):
    x0, y0 = L0.A; x1, y1 = L0.B
    x2, y2 = L1.A; x3, y3 = L1.B
    a0 = x1 - x0; b0 = y1 - y0
    a2 = x3 - x2; b2 = y3 - y2
    d = a0*b2 - a2*b0
    if d == 0: return None
    sn = b2 * (x2-x0) - a2 * (y2-y0)
    return Point(x0 + a0*sn/d, y0 + b0*sn/d)
def circle_common_point(C0, C1):
    a, b = C0.p; p = C0.r
    c, d = C1.p; q = C1.r
    f = (-2*a+2*c, -2*b+2*d, a**2+b**2-c**2-d**2-p**2+q**2)
    L = Line(formula=f)
    return C1.intersection_point(L)
def convex_hull(ps):
    ps.sort()
    qs = []
    n = len(ps)
    if n < 3: return ps
    for p in ps:
        while len(qs) > 1 and cross3(qs[-1], qs[-2], p) >= 0:
            qs.pop()
        qs.append(p)
    t = len(qs)
    for i in range(n-2, -1, -1):
        p = ps[i]
        while len(qs) > t and cross3(qs[-1], qs[-2], p) >= 0:
            qs.pop()
        qs.append(p)
    return qs[:-1]
n = int(input())
ps = []
for i in range(n):
    x, y = map(int, input().split())
    ps.append(Point(x, y))
c = convex_hull(ps)
# print(c)
print("Yes" if len(c) == n else "No")
            
            
            
        