結果
問題 | No.2169 To Arithmetic |
ユーザー |
![]() |
提出日時 | 2025-03-26 16:00:00 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,486 ms / 2,000 ms |
コード長 | 4,037 bytes |
コンパイル時間 | 311 ms |
コンパイル使用メモリ | 82,292 KB |
実行使用メモリ | 143,508 KB |
最終ジャッジ日時 | 2025-03-26 16:00:58 |
合計ジャッジ時間 | 15,141 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 25 |
ソースコード
import bisectdef main():import sysinput = sys.stdin.readdata = input().split()idx = 0N = int(data[idx])idx += 1Q = int(data[idx])idx += 1A = list(map(int, data[idx:idx+N]))idx += Nqueries = list(map(int, data[idx:idx+Q]))# Compute B array and sorted B with prefix sumB = []for j in range(1, N):B.append(A[j] - A[j-1])B.sort()prefix_sum = [0] * (len(B) + 1)for i in range(len(B)):prefix_sum[i+1] = prefix_sum[i] + B[i]# Li Chao Tree implementationclass Line:__slots__ = ['a', 'b']def __init__(self, a, b):self.a = aself.b = bdef value(self, x):return self.a * x + self.bclass LiChaoNode:__slots__ = ['line', 'left', 'right', 'l', 'r']def __init__(self, l, r):self.line = Noneself.left = Noneself.right = Noneself.l = lself.r = rclass LiChaoTree:def __init__(self, x_min, x_max):self.root = LiChaoNode(x_min, x_max)def insert_line(self, new_line):node = self.rootwhile True:l = node.lr = node.rm = (l + r) // 2if node.line is None:node.line = new_linebreakcurr_line = node.linecurr_l = curr_line.value(l)new_l = new_line.value(l)curr_r = curr_line.value(r)new_r = new_line.value(r)if new_l > curr_l and new_r > curr_r:node.line = new_linebreakif new_l <= curr_l and new_r <= curr_r:breakcurr_m = curr_line.value(m)new_m = new_line.value(m)if new_m > curr_m:node.line, new_line = new_line, curr_line# After swap, re-evaluatecurr_line = node.linecurr_l = curr_line.value(l)new_l = new_line.value(l)curr_r = curr_line.value(r)new_r = new_line.value(r)curr_m = curr_line.value(m)new_m = new_line.value(m)# Determine which child to go intoif new_l > curr_l:if not node.left:node.left = LiChaoNode(l, m)node = node.leftelse:if not node.right:node.right = LiChaoNode(m+1, r)node = node.rightdef query_max(self, x):res = -float('inf')node = self.rootwhile node:if node.line:current_val = node.line.value(x)if current_val > res:res = current_valif node.l == node.r:breakm = (node.l + node.r) // 2if x <= m:node = node.leftelse:node = node.rightreturn res# Initialize Li Chao Treex_min = -10**18x_max = 10**18tree = LiChaoTree(x_min, x_max)for j in range(N):a = -j # since x is j (0-based), line is y = -j*d + A[j]b = A[j]line = Line(a, b)tree.insert_line(line)# Process queriesA1 = A[0]output = []for d in queries:# Compute sum_partk = bisect.bisect_right(B, d)sum_d = d * k - prefix_sum[k]# Compute max_valmax_k = tree.query_max(d)max_val = max_k - A1L = max(0, max_val)ans = L + sum_doutput.append(ans)print('\n'.join(map(str, output)))if __name__ == "__main__":main()