AtCoder Beginner Contest 288 備忘録
コンテストページ: Toyota Programming Contest 2023 Spring Qual A(AtCoder Beginner Contest 288) - AtCoder
コンテスト中AC: A〜C
コンテスト後自力AC: D〜F
D - Range Add Query
0-indexedとします。
を愚直に全て0にできるか試すときどうするかを考えると、端から順に0にしていく方法が思い浮かびます。
例えば、としてシミュレートしてみます。
まず、を0にするため、にを足します。
次はにを足す…としたいところですが、足される項が増えてややこしいので、まず、をに足しておきます。
それでは先程と同様に、にを足し、にを足します。
これを繰り返しと、最終的に以下のようになります。
このようにシミュレートしてみると以下がわかります。
- にが足され、末尾項にが等しいものの累積和が構築される
最終的に末尾項が等しい場合には、を0にすることが可能です。
これより、各クエリのについて、が等しいの累積和が全て同じかを判定すればよいです。
が等しいものについてのの累積和を予め計算しておけば、区間の累積和はで求められます。
よって、各クエリで判定できます。
実装: Submission #38649675 - Toyota Programming Contest 2023 Spring Qual A(AtCoder Beginner Contest 288)
E - Wish List
まず、
- 状況が変化していき、複雑なこと
- が小さいこと
から、貪欲法よりもDPっぽいなと当たりをつけます。
をとることを考えたとき、より前が何個取られているかで、どのとなるか変化します。また、前に取られた個数が同じなら、どれが取られていても状況は同じなので、情報をひとまとめにできます。
ここから、以下のようなDPを考えます。
までを個取った時の金額の最小値
を更新することを考えます。
より前は既に個取られていたとしたら、は番目に移動しているはずなので、の金額が必要なはず、と思ってしまいますが、これは誤りです。
なぜなら、より前が個のいずれかが取られた直後にを取ることも可能だからです。
ここが重要なポイントで、番目より前に個とられているような状況について、どのタイミングでを取ったことにしてもよいです。
理由は直感的になりますが、まず、をとるタイミングを変えてもより前のとる順番には影響を与えません。
次に、をとることで、より後ろがずれて、とりたい位置でとれなくなってしまうのではないかと心配になります。
その場合は、先に後ろのものをとっておけば良いです。その後ろのものをとることで、その後ろより更に後ろがずれるなら、更にその後ろを先に取れば良いです。これを繰り返せば、最終的に一番後ろになるので、いつかは矛盾なくとれるはずです。
以上から、番目までで個取られている状況で、を取って個取られている状況にする場合、かかる金額は、
とできます。
これはSegment TreeでRMQを処理すればよいです。
以上から、DPテーブルをの順に以下のように更新できます(初期値は、が0でそれ以外は)。
をとる場合
をとらない場合
但し、がに含まれる場合はとらない選択をできません。
実装: Submission #38728052 - Toyota Programming Contest 2023 Spring Qual A(AtCoder Beginner Contest 288)
F - Integer Division
説明のため、乗算の×を挿入することを仕切りを挿入すると表現します。
例えば、は、です。
を10進数とみなしたものをとします。これは、の後ろに仕切りを入れ、その後番目まで仕切りがない場合の10進数と捉えることができます。
の順に見ていくとき、最後に仕切った場所が同じものについては、同じ10進数をかけることになります。
具体例を示します。として、を考えたとき、最後にの後ろで区切ったものを考えます。
の後ろで区切った時のそれ以前の区切り方は、
の4通りとなりますが、それより後の区切りが無いためこれらには全てが掛けられることになります。
今回は、総和を求める問題なので、以下のように解釈できます。
これを式変形すると、
カッコ内は番目まででできる全ての区切り方の積の総和です。そこで、
番目までできる全ての区切り方の積の総和
とおけば、
と表現できます。
例示したで最終的に求めたい値は、
です。なお、はの前に区切りを入れたと考え、便宜上とします。また、と考えます。
ところで、
なので、
から、
に変化させることができれば、からを計算できます。
この方法ですが、からを計算する場合、
として計算できます。
例の場合、であることから、
式変形すると、
の累積和をとすれば、
となります。
一般化すると、
となり、この漸化式を解いていけば、答えを求めることができます。
実装: Submission #38705016 - Toyota Programming Contest 2023 Spring Qual A(AtCoder Beginner Contest 288)