問題はこちら
問題概要
種類のカードがあり,最初,種類目のカードの得点は,枚数は枚である.以下の形式の個のクエリを順に処理せよ.- 種類目のカードの得点をに変更
- 種類目のカードの枚数をに変更
- 枚のカードを選ぶときの得点の総和の最大値を求める.
解説
各ノードに部分木の得点の総和とカードの枚数の総和を持つBinary Trieを作ると,各クエリで処理することができます.サンプル1を例に挙げて説明します.
初期状態のBinaryTrieは以下のようになります.
最初のクエリでは,枚使った最大の総得点を求めます.
根の右の子の枚数がであることから左の子のカードを使うことはありません.したがって,右の部分木について答えればよいです.
そのさらに右の子を見ると,枚数が枚なので右の子のカードはすべて使い,として左の子に遷移して再帰的に求めていけばよいです.
2番目のクエリや4番目のクエリのような更新では,更新前の得点や枚数を各ノードから引き,更新後の得点や枚数を足していけばよいです.