AtCoder Beginner Contest 17 C - ハイスコア

※このエントリは競プロで圧倒的成長 Advent Calendar 2015の5日目のエントリです.

CODE THANKS FESTIVALに向かう新幹線の中から.

問題はこちら

問題要約

  • N個の宝石とM種類の宝石がある
  • i番目の遺跡に訪れるとli番目からri番目の宝石が全て手に入りsi点もらえる
  • 全ての宝石を手に入れないように点数を最大化する

解法

まず,全ての遺跡に訪れた場合を考える. 次に,i番目の宝石を手に入れない場合点数はどうなるかを考える. 例えば以下の入力では,

[code lang=text] 2 3 1 2 10 2 3 20 [/code]

全ての遺跡に訪れた場合,点数は30点だが全ての宝石を手に入れてしまう.
1を手に入れない場合は遺跡1に訪れないことになるため,失う点数は10点.
2を手に入れない場合は遺跡1, 2の両方に訪れないことになるため失う点数は30点.
3を手に入れない場合は遺跡2を訪れないことになるため,失う点数は20点である.
つまり,宝石iが何点に影響しているかを考え,最も小さい宝石を手に入れなければよい.
そのような処理はいもす法で実現できる (セグメントツリーでも可能だけど101点は取れないかもしれない).