結果
問題 |
No.3154 convex polygon judge
|
ユーザー |
![]() |
提出日時 | 2025-05-27 03:18:13 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,356 ms / 2,000 ms |
コード長 | 1,307 bytes |
コンパイル時間 | 717 ms |
コンパイル使用メモリ | 12,416 KB |
実行使用メモリ | 66,116 KB |
最終ジャッジ日時 | 2025-05-27 03:18:25 |
合計ジャッジ時間 | 11,223 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 44 |
ソースコード
import sys input = sys.stdin.readline from operator import itemgetter from math import gcd N=int(input()) P=[tuple(map(int,input().split())) for i in range(N)] # 頂点の集合 P.sort(key=itemgetter(1)) # 一番左下の点から始める。 P.sort(key=itemgetter(0)) # 上側凸包と下側凸包 Q1=[] Q2=[] def outer_product(x,y,z,w): return x*w-y*z for x,y in P: while True: if len(Q1)<2: break s,t=Q1[-1] u,v=Q1[-2] if outer_product(u-s,v-t,x-u,y-v)<0: Q1.pop() else: break Q1.append((x,y)) while True: if len(Q2)<2: break s,t=Q2[-1] u,v=Q2[-2] if outer_product(u-s,v-t,x-u,y-v)>0: Q2.pop() else: break Q2.append((x,y)) Q2.reverse() Q=Q1+Q2[1:] # 上側凸包と下側凸包を結んで凸包が完成 if len(set(Q))!=N: print("No") exit() for i in range(len(Q)-2): a,b=Q[i] c,d=Q[i+1] e,f=Q[i+2] if c-a==0 and e-a==0: print("No") exit() if d-b==0 and f-b==0: print("No") exit() g=gcd(c-a,d-b) h=gcd(e-a,f-b) A=((c-a)//g,(d-b)//g) B=((e-a)//h,(f-b)//h) if A==B: print("No") exit() print("Yes")