結果
| 問題 |
No.703 ゴミ拾い Easy
|
| コンテスト | |
| ユーザー |
satama6
|
| 提出日時 | 2023-02-12 12:19:53 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,672 bytes |
| コンパイル時間 | 171 ms |
| コンパイル使用メモリ | 82,240 KB |
| 実行使用メモリ | 174,348 KB |
| 最終ジャッジ日時 | 2024-07-16 04:38:28 |
| 合計ジャッジ時間 | 13,935 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 25 WA * 21 |
ソースコード
class LiChaoTree:
def __init__(self, M, A) -> None:
"""
最小値クエリで聞かれる{x1, ..., xn}が既知の時(クエリ先読み)
"""
self.M = M # クエリ数
l = 1
while l < M:
l <<= 1
self.length = l
self.sg = [None] * (2 * l) # (a, b)直線
self.X = [1 << 60] * l
self.update_X(A)
def update_X(self, A):
self.X = A + [1 << 60] * (self.length - self.M)
def get_value(self, line, x):
"""座標xにおける直線lineの値
"""
return line[0] * x + line[1]
def _add_line(self, line, k, l, r):
"""トップダウンに更新
右、左、真ん中を比較して、lineが必要か不要かを判定
Parameter
-----------
k: 現在処理している区間に対応するセグ木上のインデックス
l: 現在処理している区間に対応する座標の左端
r: 現在処理している区間に対応する座標の右端
"""
if self.sg[k] == None : self.sg[k] = line; return
m = (l + r) // 2
lx, mx, rx = self.X[l], self.X[m], self.X[r-1]
left = self.get_value(line, lx) < self.get_value(self.sg[k], lx) # 左端
middle = self.get_value(line, mx) < self.get_value(self.sg[k], mx) # 真ん中
right = self.get_value(line, rx) < self.get_value(self.sg[k], rx) # 右端
# 元々の直線よりもlineの方が値が小さい
if left and right:self.sg[k] = line; return
# 元々の直線の方がlineよりも値が小さい
elif not (left or right) : return
# 元々の直線とlineが交わっている、かつ真ん中でlineの方が小さい
if middle : self.sg[k], line = line, self.sg[k]
# 左側をlineに更新しなければならない
if left != middle : self._add_line(line, 2*k, l, m)
# 右側をlineに更新しなければならない
else : self._add_line(line, 2*k+1, m, r)
def add_line(self, line):
self._add_line(line, 1, 0, self.M)
def gen(self, k, x):
k += self.length
while k > 0:
if self.sg[k] is not None : yield self.get_value(self.sg[k], x)
k >>= 1
def query(self, k, x):
return min(self.gen(k, x))
N = int(input())
A = list(map(int, input().split()))
X = list(map(int, input().split()))
Y = list(map(int, input().split()))
lichao = LiChaoTree(N, A)
v = 0
for i in range(N):
lichao.add_line((-2*X[i], X[i]**2 + Y[i]**2 + v))
v = lichao.query(i, A[i]) + A[i]**2
print(v)
satama6