def solve(N, HS, VS):
values = [0] * (N + 1)
for i in range(N):
h = HS[i]
values[h] = max(values[:h]) + VS[i]
return max(values)
フェニック木
python
def solve(N, HS, VS):
bit = [0] * (N + 1) # 1-origin
def bit_put(pos, val):
assert pos > 0
x = pos
while x <= N:
bit[x] = max(bit[x], val)
x += x & -x # (x & -x) = rightmost 1 = block width
def bit_max(pos):
assert pos > 0
ret = 0
x = pos
while x > 0:
ret = max(ret, bit[x])
x -= x & -x
return ret
for i in range(N):
h = HS[i]
m = bit_max(h)
bit_put(h, m + VS[i])
return bit_max(N)