ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC017 C - ハイスコア

問題
提出コード
すんなり考察&実装がいったので結構好きです。

解法

1つも入手しない宝石の種類を1つ決めると、それ以外の全ての宝石は獲得しても問題ありません。これについて考えるとき、2種類目以降の獲得しない宝石が存在しようがしまいが関係ありません。
ということで、
memo[i] = i番目の宝石を獲得しない、と決めたときに得られる得点の最大値
という配列を埋めていくことを考えます。
j番目の遺跡を探索すると、l_jからr_jまでの宝石を入手します。得点はs_jです。
ということは、先ほどの配列について考えると、iが
1l_j-1までと、r_j+1M
場所に、s_jを追加できますこれは、j番目の遺跡を探索しても、上記の区間内の宝石は獲得しないので、配列の条件を満たすからです。
これをすべてのjについて行えばいいのですが、配列の要素1つ1つにs_jを追加していると間に合いません。
区間のすべてに要素を追加するので、いもす法を使います。
memo[1]とmemo[ r_j+1 ]にs_jを追加し、memo[ l_j ]とmemo[ M+1 ]からs_jを引きます。これをすべてのjについて行い、最後にmemo[1]から順番に累積和をとっていくと、配列の計算が完了します。
あとは、これらすべての要素を確認して、その中の最大値をとってくれば答えとなります。