結果
問題 | No.2012 Largest Triangle |
ユーザー |
![]() |
提出日時 | 2022-07-15 23:05:26 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,088 ms / 2,500 ms |
コード長 | 1,750 bytes |
コンパイル時間 | 363 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 111,580 KB |
最終ジャッジ日時 | 2024-06-27 21:24:37 |
合計ジャッジ時間 | 26,257 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 41 |
ソースコード
from decimal import *def sgn(x):if x==0:return 0if x>0:return 1return -1def check(a,b,c):#if a==b or b==c:# return sgn(b[0]-a[0])*sgn(c[1]-b[1])>=sgn(c[0]-b[0])*sgn(b[1]-a[1])return (b[0]-a[0])*(c[1]-b[1])>=(c[0]-b[0])*(b[1]-a[1])def get_y(a,x):return a[0]*x+a[1]from collections import dequeclass CHT:__slots__=['H','F']def __init__(self,f):self.H=deque()self.F=fdef add(self,x):h=self.Hif self.F:x=(-x[0],-x[1])if len(h)==0:h.append(x)return 0if h[0][0]<=x[0]:if h[0][0]==x[0]:if h[0][1]<=x[1]:return 0h.popleft()while(len(h)>=2 and check(x,h[0],h[1])):h.popleft()h.appendleft(x)else:if(h[-1][0]==x[0]):if(h[-1][1]<=x[1]):return 0h.pop()while(len(h)>=2 and check(h[-2],h[-1],x)):h.pop()h.append(x)def query_i(self,x):h=self.Ha=h[0]if len(h)>=2:b=h[1]while(len(h)>=2 and a[0]*x+a[1]>=b[0]*x+b[1]):h.popleft()a=bif len(h)<2:breakb=h[1]if self.F:return -a[0]*x-a[1]else:return a[0]*x+a[1]getcontext().prec=30Decimal=lambda x:xN=int(input())eps=Decimal('1e-12')eps=float(eps)X=[tuple(map(lambda x:Decimal(int(x)+eps),input().split())) for i in range(N)]A=CHT(True)B=CHT(False)X.sort(key=lambda x:x[1])for i in range(N):a,b=X[i][0],X[i][1]A.add((b,-a))B.add((b,-a))X.sort(key=lambda x:x[0]/x[1])ANS=0for i in range(N):a,b=X[i][0],X[i][1]x,y=B.query_i(a/b),A.query_i(a/b)ANS=max(ANS,-x*b,-y*b,x*b,y*b)if b>=0:ANS=max(ANS,x*b,-y*b)else:ANS=max(ANS,-x*b,y*b)print(round(ANS))