結果
| 問題 | No.777 再帰的ケーキ |
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 20:31:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,461 ms / 2,000 ms |
| コード長 | 2,372 bytes |
| コンパイル時間 | 147 ms |
| コンパイル使用メモリ | 82,352 KB |
| 実行使用メモリ | 159,480 KB |
| 最終ジャッジ日時 | 2025-03-20 20:32:46 |
| 合計ジャッジ時間 | 11,915 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 33 |
ソースコード
import bisect
class SegmentTreeMax:
def __init__(self, size):
self.n = 1
while self.n < size:
self.n <<= 1
self.size = self.n
self.tree = [0] * (2 * self.n)
def update(self, idx, value):
idx += self.n
if self.tree[idx] >= value:
return
self.tree[idx] = value
while idx > 1:
idx >>= 1
new_val = max(self.tree[2*idx], self.tree[2*idx+1])
if self.tree[idx] == new_val:
break
self.tree[idx] = new_val
def query(self, l, r):
res = 0
l += self.n
r += self.n
while l < r:
if l % 2 == 1:
res = max(res, self.tree[l])
l += 1
if r % 2 == 1:
r -= 1
res = max(res, self.tree[r])
l >>= 1
r >>= 1
return res
# Read input
n = int(input())
cakes = []
all_B = []
for _ in range(n):
A, B, C = map(int, input().split())
cakes.append( (A, B, C) )
all_B.append(B)
# Compress B coordinates
sorted_B = sorted(list(set(all_B)))
m = len(sorted_B)
# Sort cakes by A descending then B descending
cakes.sort(key=lambda x: (-x[0], -x[1]))
# Group by A
groups = []
current_A = None
current_group = []
for cake in cakes:
A = cake[0]
if A != current_A:
if current_group:
groups.append(current_group)
current_group = [cake]
current_A = A
else:
current_group.append(cake)
groups.append(current_group)
# Initialize segment tree
st = SegmentTreeMax(m)
max_answer = 0
for group in groups:
dps = []
for cake in group:
A_j, B_j, C_j = cake
# Compute q_idx = bisect_right(B_j)
q_idx = bisect.bisect_right(sorted_B, B_j)
# Query from q_idx to m
max_prev = st.query(q_idx, m)
current_dp = C_j + (max_prev if max_prev > 0 else 0)
dps.append(current_dp)
if current_dp > max_answer:
max_answer = current_dp
# Update the segment tree for each cake in the group
for cake, current_dp in zip(group, dps):
B_j = cake[1]
# Find the compressed index
b_idx = bisect.bisect_left(sorted_B, B_j)
# Update the segment tree at b_idx with current_dp
st.update(b_idx, current_dp)
print(max_answer)
lam6er