Processing math: 57%

目次

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)F,G問題メモ

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

F - Black Jack

F - Black Jack

問題

解法

自分が、バーストの可能性のある持ち点から続けて振るべきかどうかは、 ディーラーの最終的な持ち点の確率分布が分からないと何とも言えない。

ディーラーの行動は決まっていて、持ち点 i になる確率 Pi は計算できる。
なのでまずそれを計算する。

i=0L1 に対して、ダイスの目の分だけ分配していけばいい。

N=5 D=3, L=4
                                 |→Burst
 i   0    1    2    3    4    5  |  6    7
     1    0    0    0    0    0  |  0    0
     `----v----v----v
       + 1/3  1/3  1/3
     0   1/3  1/3  1/3   0    0     0    0
          `----v----v----v
           +  1/9  1/9  1/9
     0    0   4/9  4/9  1/9   0     0    0
               `----v----v----v
                 + 4/27 4/27 4/27
     0    0    0  16/27 7/27 4/27   0    0
                    `----v----v-----v
                     + 16/81 16/81 16/81
Pi   0    0    0    0  37/81 28/81 16/81 0

以下を求める。

Wi に関して、あなたは持ち点でディーラーを真に上回らないといけないので、 Pi の累積和を取って1つ右にずらしたものが暫定の Wi となる。

                                 |→Burstにつき無意味
 i   0    1    2    3    4    5  |(   6     7   )
Wi   0    0    0    0    0  37/81|( 65/81 81/81 )

ただし、ディーラーがバーストした時は、あなたはバーストしてない限り勝つ。
ディーラーのバースト確率 1681Wi 全体に加算する。これが最終的な Wi となる。

 i   0     1     2     3     4     5   (  6    7    8  ...)
Wi 16/81 16/81 16/81 16/81 16/81 53/81 (  0    0    0  ...)

あなたは、持ち点 i の時、 「操作をここで終えるか、ダイスを振って持ち点を i+1i+D のどれかにするか」を選べる。
勝率の高い行動を採用すべきである。

Si=max となる。

S をセグメント木などに載せ、i の降順に S_i を求めていき、S_0 が答え。

計算量は O(N\log{N})。少し実装が泥臭くなるが累積和を使うと、O(N)

Python3

G - Retroactive Range Chmax

G - Retroactive Range Chmax

問題

解法

クエリの取り消しが必要。

取り消す更新が加算など逆演算の存在する操作なら、「操作を取り消す=加算した分を減算する」が成り立つが、残念ながら max は操作後から操作前を復元できない。

縦に時間(クエリ番号)、横に A のindexをもった2次元座標をイメージする。

  →index
↓
ク   ┌─┐
エ   │┌┼─┐
リ   └┼┘  │
       └──┘

クエリを先読みして、各クエリがいつ取り消されるかを求めておけば、ひとつのクエリの影響範囲は矩形になる。
この問題は「矩形 chmax、1点取得」のデータ構造があればよい。

双対2次元セグメント木がその条件を満たす。
Q \times N の配列は持てないので必要な部分だけを作る動的セグメント木にすると、空間計算量は O(Q \log{N} \log{Q}) で済む。

時間計算量も O(N+Q\log{N}\log{Q}) となり、制限時間が長いので、通る。

Python3