結果
| 問題 |
No.1375 Divide and Update
|
| コンテスト | |
| ユーザー |
tktk_snsn
|
| 提出日時 | 2021-02-05 22:41:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 342 ms / 2,000 ms |
| コード長 | 2,380 bytes |
| コンパイル時間 | 187 ms |
| コンパイル使用メモリ | 82,604 KB |
| 実行使用メモリ | 148,196 KB |
| 最終ジャッジ日時 | 2024-07-02 13:24:16 |
| 合計ジャッジ時間 | 6,069 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 19 |
ソースコード
from itertools import accumulate
inf = 10**18
class SegTree(object):
def __init__(self, N, op_data, u_data):
self._n = N
self.log = (N-1).bit_length()
self.size = 1 << self.log
self.op = op_data
self.e = u_data
self.data = [u_data] * (2 * self.size)
# self.len = [1] * (2 * self.size)
def _update(self, i):
self.data[i] = self.op(self.data[i << 1], self.data[i << 1 | 1])
def initialize(self, arr=None):
""" segtreeをarrで初期化する。len(arr) == Nにすること """
if arr:
for i, a in enumerate(arr, self.size):
self.data[i] = a
for i in reversed(range(1, self.size)):
self._update(i)
# self.len[i] = self.len[i << 1] + self.len[i << 1 | 1]
def update(self, p, x):
""" data[p] = x とする (0-indexed)"""
p += self.size
self.data[p] = x
for i in range(1, self.log + 1):
self._update(p >> i)
def get(self, p):
""" data[p]を返す """
return self.data[p + self.size]
def prod(self, l, r):
"""
op_data(data[l], data[l+1], ..., data[r-1])を返す (0-indexed)
"""
sml = self.e
smr = self.e
l += self.size
r += self.size
while l < r:
if l & 1:
sml = self.op(sml, self.data[l])
l += 1
if r & 1:
r -= 1
smr = self.op(self.data[r], smr)
l >>= 1
r >>= 1
return self.op(sml, smr)
def all_prod(self):
""" op(data[0], data[1], ... data[N-1])を返す """
return self.data[1]
N, X, Y = map(int, input().split())
A = list(map(int, input().split()))
sumA = [0] + list(accumulate(A))
L = [X * i - s for i, s in enumerate(sumA)]
R = [Y * i - s for i, s in enumerate(sumA)]
memoL = [-inf] * (N + 1)
seg = SegTree(N + 1, min, inf)
seg.initialize(L)
memoL[1] = L[1] - L[0]
for i in range(2, N + 1):
x = seg.prod(0, i)
memoL[i] = max(memoL[i-1], L[i] - x)
memoR = [-inf] * (N + 1)
seg = SegTree(N + 1, max, -inf)
seg.initialize(R)
memoR[N-1] = R[N] - R[N-1]
for i in reversed(range(N - 1)):
x = seg.prod(i + 1, N + 1)
memoR[i] = max(memoR[i+1], x - R[i])
X = sum(A)
for i in range(1, N - 1):
print(X + memoL[i] + memoR[i+1])
tktk_snsn