Official

D - イベント会場の予約 / Event Venue Reservation Editorial by sounansya


最大化する値は \(\displaystyle |S|\times B-\sum_{\lbrace 1,2,\ldots,N\rbrace \backslash S} C_i =\sum_{i \in S} (B+C_i)- \sum_{i=1}^N C_i\) となります。\(\displaystyle \sum_{i=1}^N C_i\) は定数なので、\(\displaystyle \sum_{i \in S} (B+C_i)\) を最大化すれば良いです。

そして、これは典型的な重み付き区間スケジューリング問題です。これは、時刻と重みの組 \((L_i,R_i,B+C_i)\)\(R_i\) の昇順にソートし、\(d[i]\) を「イベント \(i\) まで考えた時の重みの総和の最大値」とした動的計画法で \(O(N\log N)\) 時間で解くことができます。

以上を適切に実装することでこの問題に正答することができます。

実装例(Python3)

import sys, bisect

input = sys.stdin.readline
n, b = map(int, input().split())
offset = 0
g = [(-1, -1, 0)]
for i in range(n):
    l, r, c = map(int, input().split())
    g.append((l, r, c + b))
    offset += c
g.sort(lambda x: x[1])
e = [gg[1] for gg in g]
d = [0] * (n + 1)
for i in range(1, n + 1):
    j = bisect.bisect_right(e, g[i][0]) - 1
    d[i] = max(d[i - 1], d[j] + g[i][2])
print(d[-1] - offset)

posted:
last update: