結果
| 問題 |
No.2012 Largest Triangle
|
| コンテスト | |
| ユーザー |
googol_S0
|
| 提出日時 | 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 0
if x>0:
return 1
return -1
def 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 deque
class CHT:
__slots__=['H','F']
def __init__(self,f):
self.H=deque()
self.F=f
def add(self,x):
h=self.H
if self.F:
x=(-x[0],-x[1])
if len(h)==0:
h.append(x)
return 0
if h[0][0]<=x[0]:
if h[0][0]==x[0]:
if h[0][1]<=x[1]:
return 0
h.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 0
h.pop()
while(len(h)>=2 and check(h[-2],h[-1],x)):
h.pop()
h.append(x)
def query_i(self,x):
h=self.H
a=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=b
if len(h)<2:
break
b=h[1]
if self.F:
return -a[0]*x-a[1]
else:
return a[0]*x+a[1]
getcontext().prec=30
Decimal=lambda x:x
N=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=0
for 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))
googol_S0