結果
問題 | No.2458 Line Up Charged Balls |
ユーザー |
![]() |
提出日時 | 2025-04-15 22:51:43 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,840 bytes |
コンパイル時間 | 185 ms |
コンパイル使用メモリ | 81,796 KB |
実行使用メモリ | 140,648 KB |
最終ジャッジ日時 | 2025-04-15 22:54:19 |
合計ジャッジ時間 | 5,112 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 5 WA * 1 TLE * 1 -- * 18 |
ソースコード
class Line: def __init__(self, a, b): self.a = a self.b = b def get(self, x): return self.a * x + self.b class LiChaoTree: def __init__(self, x_min, x_max): self.x_min = x_min self.x_max = x_max self.nodes = [] self.nodes.append({'l': x_min, 'r': x_max, 'line': None, 'left': -1, 'right': -1}) def insert_line(self, new_line): stack = [0] while stack: node_idx = stack.pop() node = self.nodes[node_idx] l, r = node['l'], node['r'] if node['line'] is None: node['line'] = new_line continue current_line = node['line'] m = (l + r) // 2 cl_l = current_line.get(l) nl_l = new_line.get(l) cl_r = current_line.get(r) nl_r = new_line.get(r) if nl_l > cl_l and nl_r > cl_r: node['line'] = new_line continue if nl_l <= cl_l and nl_r <= cl_r: continue cl_m = current_line.get(m) nl_m = new_line.get(m) if nl_m > cl_m: node['line'], new_line = new_line, current_line if new_line.get(l) > current_line.get(l): if node['left'] == -1: new_node = {'l': l, 'r': m, 'line': None, 'left': -1, 'right': -1} self.nodes.append(new_node) node['left'] = len(self.nodes) - 1 stack.append(node['left']) else: if node['right'] == -1: new_node = {'l': m + 1, 'r': r, 'line': None, 'left': -1, 'right': -1} self.nodes.append(new_node) node['right'] = len(self.nodes) - 1 stack.append(node['right']) def query(self, x): res = -float('inf') node_idx = 0 while node_idx != -1: node = self.nodes[node_idx] line = node['line'] if line is not None: res = max(res, line.get(x)) m = (node['l'] + node['r']) // 2 if x <= m: next_node = node['left'] else: next_node = node['right'] node_idx = next_node return res def main(): import sys input = sys.stdin.read().split() N = int(input[0]) Q = list(map(int, input[1:N+1])) tree = LiChaoTree(-10**18, 10**18) max_E = -float('inf') for i in range(N): q = Q[i] if i == 0: tree.insert_line(Line(q, 0)) else: current = tree.query(q) tree.insert_line(Line(q, current)) if current > max_E: max_E = current print(max_E) if __name__ == "__main__": main()