結果

問題 No.3017 交互浴
ユーザー D M
提出日時 2025-02-05 15:03:53
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 3,965 bytes
コンパイル時間 701 ms
コンパイル使用メモリ 82,372 KB
実行使用メモリ 371,524 KB
最終ジャッジ日時 2025-02-05 15:04:37
合計ジャッジ時間 36,688 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 50 TLE * 5
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

def solve():
import sys, bisect
data = sys.stdin.buffer.read().split()
if not data:
return
N = int(data[0])
# H_i
Hs = [int(x) for x in data[1:1+N]]
# segments endpoints
# segments [(L, R, col)] endpoints[i] = R ( [L, R) )
# [0, current_max) current_max segments[-1][1]
segments = [] # 0
endpoints = [] #
current_max = 0
waterblue = 0 #
out_lines = []
# 1-indexed
for i, h in enumerate(Hs, start=1):
# i : (1), (0)
new_col = 1 if (i & 1) else 0
if current_max < h:
# [0, h)
# [0, current_max) [current_max, h)
segments = [(0, h, new_col)]
endpoints = [h]
current_max = h
waterblue = h if new_col == 1 else 0
else:
# current_max >= h
# segments [0, current_max) [0, h)
# [0, h)
# segments [0, current_max)
# endpoints 使 h pos
pos = bisect.bisect_left(endpoints, h)
# pos segments[pos] h
removed_blue = 0
# pos pos [L,R) ∘ [0, h)
for j in range(pos):
L, R, col = segments[j]
if col == 1:
removed_blue += (R - L)
# pos
if pos < len(segments):
L, R, col = segments[pos]
if h > L and col == 1:
removed_blue += (h - L)
# [0, h) new_col
new_blue = h if new_col == 1 else 0
waterblue = waterblue - removed_blue + new_blue
#
# [0, h) : new_col
# pos [L, R, col] h < R [h, R)
# segments[pos+1:]
new_segments = [(0, h, new_col)]
new_endpoints = [h]
if pos < len(segments):
L, R, col = segments[pos]
if h < R:
new_segments.append((h, R, col))
new_endpoints.append(R)
pos += 1
# pos
if pos < len(segments):
new_segments.extend(segments[pos:])
new_endpoints.extend(endpoints[pos:])
#
segments = new_segments
endpoints = new_endpoints
# 2
if len(segments) >= 2 and segments[0][2] == segments[1][2]:
# [0, segments[1][1])
merged = (0, segments[1][1], segments[0][2])
segments[0] = merged
endpoints[0] = merged[1]
del segments[1]
del endpoints[1]
# current_max
out_lines.append(str(waterblue))
sys.stdout.write("\n".join(out_lines))
if __name__ == '__main__':
solve()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0