難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Half Selection Game

作成者 loop0919

テスター mackerel38

難易度(作成者設定) Lv.6

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

Bob がどのように操作しても Alice が YY を区間 [L,R][L, R] に収められる範囲を考えます。
区間の下端 LL を固定して、条件を満たす最小の上端 RR を求めます。

ゲームの各状態を頂点とし、前半・後半を選んだ状態を左右の子とする二分木を作ります。葉は各要素 AiA_i に対応します。

各頂点にはその状態から Alice が L≤Y≤RL \le Y \le R を保証できる最小の RR を持たせます。(保証できない場合は ∞\infty とします。)

葉 ii の値は以下の通りです。

{Ai(if   Ai≥L)∞(if   Ai<L)\begin{aligned} \begin{cases} A_i & (\text{if ~ $A_i \ge L$}) \\ \infty & (\text{if ~ $A_i \lt L$}) \end{cases} \end{aligned}

また、各頂点では左右の子の値を u,vu, v とすると以下の通りです。

{min⁡(u,v)(if   Alice の手番)max⁡(u,v)(if   Bob の手番)\begin{aligned} \begin{cases} \min(u, v) & (\text{if ~ Alice の手番}) \\ \max(u, v) & (\text{if ~ Bob の手番}) \end{cases} \end{aligned}

根からの深さが偶数なら Alice の手番、奇数なら Bob の手番です。

そしてこの二分木は、以下の手続きで差分更新を行うことができます。

  1. はじめ、すべての葉の値を ∞\infty とする。
  2. AA を降順にソートしたものを A′A' とする。 L=A1′,A2′,⋯ ,AN′L = A'_1, A'_2, \cdots, A'_N の順に以下の操作を行う。
    • Ai=LA_i = L となる各 ii に対して、葉 ii の値を LL に更新する。
    • その後、対応する葉の各祖先を更新する。

今まで出現した根の R−LR - L の値としてあり得る最小値を WW としたとき、答えは ⌈W/2⌉\lceil W / 2 \rceil となります。

木の高さは O(log⁡N)O(\log N) となるため、全体の計算量は O(Nlog⁡N)O(N \log N) です。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。