結果
| 問題 |
No.3154 convex polygon judge
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2025-05-20 22:48:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,320 ms / 2,000 ms |
| コード長 | 2,707 bytes |
| コンパイル時間 | 298 ms |
| コンパイル使用メモリ | 82,384 KB |
| 実行使用メモリ | 109,404 KB |
| 最終ジャッジ日時 | 2025-06-17 17:04:16 |
| 合計ジャッジ時間 | 9,694 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 44 |
ソースコード
from math import sqrt, sin, cos, atan2, tau
class Vec2:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f'({self.x}, {self.y})'
def dot(self, o):
return self.x * o.x + self.y * o.y
def cross(self, o):
return self.x * o.y - self.y * o.x
def normalized(self):
m = self.mag()
if m != 0 and m != 1:
return Vec2(self.x / m, self.y / m)
return self
def magsq(self):
return self.x * self.x + self.y * self.y
def mag(self):
return sqrt(self.magsq())
def rotate(self, rad):
x = self.x * cos(rad) - self.y * sin(rad)
y = self.x * sin(rad) + self.y * cos(rad)
return Vec2(x, y)
def rot90ccw(self):
return Vec2(-self.y, self.x)
def distance(self, other) -> float:
return (self - other).mag()
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __ne__(self, other):
return not self.__eq__(other)
def __lt__(self, other):
if self.x == other.x:
return self.y < other.y
return self.x < other.x
def __add__(self, other):
return Vec2(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Vec2(self.x - other.x, self.y - other.y)
def __mul__(self, d):
return Vec2(self.x * d, self.y * d)
def __rmul__(self, d):
return self.__mul__(d)
def __truediv__(self, d):
return Vec2(self.x / d, self.y / d)
def __neg__(self):
return Vec2(-self.x, -self.y)
def __iadd__(self, other):
self.x += other.x
self.y += other.y
return self
def __isub__(self, other):
self.x -= other.x
self.y -= other.y
return self
def convex_hull(points: list[Vec2]) -> list[Vec2]:
"""凸包を求める(反時計回りに頂点を返す)。
cross() <= 0 を cross < 0 にすると辺上の点も凸包を構成する点に含める。
"""
if len(points) <= 2: return points
ps = sorted(points)
vs = [Vec2(0, 0)] * (len(ps) * 2)
k = 0
for i in range(len(ps)):
while k >= 2 and (vs[k-1] - vs[k-2]).cross(ps[i] - vs[k-1]) <= 0:
k -= 1
vs[k] = ps[i]
k += 1
t = k
for i in range(len(ps)-2, -1, -1):
while t < k and (vs[k-1] - vs[k-2]).cross(ps[i] - vs[k-1]) <= 0:
k -= 1
vs[k] = ps[i]
k += 1
return vs[:k-1]
N = int(input())
ps = []
for _ in range(N):
X, Y = map(int, input().split())
ps.append(Vec2(X, Y))
res = convex_hull(ps)
if len(res) == N:
print('Yes')
else:
print('No')
norioc