目次
日本レジストリサービス(JPRS)プログラミングコンテスト2025#2(AtCoder Beginner Contest 415)E,F,G問題メモ
E - Hungry Takahashi
問題文
- $H$ 行 $W$ 列のグリッドがあります。
- 上から $i$ 行目、左から $j$ 列目のマスのことを $(i,j)$ と表記します。
- 各マスには何枚かのコインが置かれており、マス $(i,j)$ に置かれているコインは $A_{i,j}$ 枚です。
- 高橋君ははじめマス $(1,1)$ におり、$x$ 枚のコインを持っています。
- これから $H+W-1$ 日間にかけていくつかの出来事が起こります。$k\ (1\leq k\leq H+W-1)$ 日目には以下のことが順に起こります:
- 高橋君が、そのときいるマスに置かれたコインを全て回収する。
- お腹の空いた高橋君が、手持ちのコインを $P_k$ 枚消費してご飯を買う。
- ただし、所持しているコインが $P_k$ 枚未満の場合ご飯を買うことはできず、空腹のあまり倒れてしまう。
- $k \lt H+W−1$ ならば、高橋君が、そのときいるマスの $1$ つ右または $1$ つ下のいずれかのマスを選んでそこに移動する。
- ただし、グリッドの外に出てしまうような移動はできない。
- $k=H+W−1$ ならば、何もしない。
- 高橋君が一度も空腹で倒れることなくこれからの $H+W-1$ 日間を終えられるような方法が存在するとき、高橋君がはじめに持っているコインの枚数 $x$ としてありうる最小の非負整数を求めてください。
制約
- $H,W\geq 1$
- $H\times W \leq 2\times 10^5$
- $1\leq A_{i,j}\leq 10^9$
- $1\leq P_k\leq 10^9$
- 入力は全て整数
解法
二分探索してシミュレーション。手持ちのコインは常に多い方がいいので、以下のDPでできる。
- $\mathrm{DP}_x[i,j]:=$ 手持ち $x$ 枚でスタートして、マス $(i,j)$ に到達してコインを拾い、ご飯を買った後の枚数として可能な最大値
途中で負になったら、そのマスからは遷移してはいけないとする。
計算量 $O(HW \log((H+W)\max(P)))$
解法2
よりよい解法。最後から考えるとよい。
- $DP[i,j]:=$ マス $(i,j)$ をスタートし、$(H,W)$ まで所持金を負にすることなく移動可能な、最初の手持ちの最小値
- 最初の手持ちとは、スタートマス $(i,j)$ においてコインを拾ったり、ご飯を買う「前」の状態とする
こうすると、$(i,j)$ からは、$(i+1,j),(i,j+1)$ のうちより必要な手持ちが少ない方のマスを選んで遷移することができる。
F - Max Combo
問題文
- 長さ $N$ の英小文字からなる文字列 $S$ があります。以下のクエリを全部で $Q$ 個処理してください。
- タイプ $1$ : $S$ の $i$ 文字目を $x$ に変更する。
- タイプ $2$ : 現時点の $S$ の $l$ 文字目から $r$ 文字目までを抜き出した文字列を $t$ とする。
- この文字列に対して「$f(t):=t$ 中の同じ文字の連続の最大長」を求めよ。
- 例えば $f($ aaaccbbbb $)=4$ 、 $f($ bbaaabb $)=3$ 、 $f($ x $)=1$ である。
制約
- $N$ は $1$ 以上 $5 \times 10^5$ 以下の整数
- $S$ は英小文字からなる長さ $N$ の文字列
- $Q$ は $1$ 以上 $5 \times 10^5$ 以下の整数
- タイプ $1$ のクエリは以下の制約を満たす
- $i$ は $1$ 以上 $N$ 以下の整数
- $x$ は英小文字
- タイプ $2$ のクエリは以下の制約を満たす
- $l,r$ は $1 \le l \le r \le N$ を満たす整数
解法
ちょこっと載せるものが複雑なセグメント木。
複雑とはいえ、載せるものの定義さえしてしまえばライブラリに任せるだけ。
左右要素をマージするとき、
「左の右端から続く同じ文字の連続」と「右の左端から続く同じ文字の連続」がくっついて、
長い連続が新たに生じることがある。
それがわかるような情報を持たせないといけない。
aaabbbcc + ccdddeee = aaabbbccccdddeee ~~ ~~ ~~~~
よって、以下があれば良さそう。
- 左端の文字 & 左端から続く同じ文字の連続数
- 右端の文字 & 右端から続く同じ文字の連続数
- 端に限らず文字列内で最も長い同じ文字の連続数
ただし、要素が全て同じ文字からなる場合は、右の要素の「左端」が、左の要素全体を貫通する。(左右逆も成り立つ)
aaaaaaaa + aabbbccc = aaaaaaaaaabbbccc ~~~~~~~~~~
そのため、この場合はちょっと特殊処理をするため、追加で以下も持たせると良い。
- 全てが同じ文字からなるフラグ
G - Get Many Cola
問題文
- 不思議なコーラショップがあります。このショップは直接コーラを売ることはしませんが、コーラの空き瓶と新しい瓶入りコーラとの交換サービスを提供しています。
- はじめ、高橋君は瓶入りコーラを $N$ 本、空き瓶を $0$ 本持っており、これから以下のいずれかの行動を選んで取ることを好きな回数繰り返すことができます($0$ 回でもよい)。
- 持っている瓶入りコーラ $1$ 本を飲む。持っている瓶入りコーラの本数が $1$ 減り、空き瓶の本数が $1$ 増える。
- 行動前に $1$ 本も瓶入りコーラを持っていない場合、この行動は取れない。
- $1$ 以上 $M$ 以下の整数 $i$ を選ぶ。コーラショップに $A_i$ 本の空き瓶を渡し、引き換えに $B_i$ 本の瓶入りコーラをもらう。
- 行動前に持っている空き瓶の本数が $A_i$ 未満であるような $i$ は選ぶことができない。
- 高橋君はコーラが大好きです。うまく行動を取ったとき、最大で何本のコーラを飲むことができますか?
制約
- $1\leq N \leq 10^{15}$
- $1\leq M \leq 2\times 10^5$
- $1\leq B_i \lt A_i \leq 300$
- 入力は全て整数
解法
制約が特徴的で、$A_i \le 300$ である。
必要な空き瓶 $A_i$ が同じなら貰えるコーラ $B_i$ は多い方が絶対にいいので、事前整理すると、実質 $M \le 300$ と考えてよい。
$D_i=A_i-B_i$ とすると、交換は「空き瓶 $A_i$ 本以上持った状態の時、$D_i$ 本を割り、残り $B_i$ 本にコーラを充填してもらう」と言い換えられる。
つまり、問題全体は以下のように言い換えられる。
- Score を $N$ で初期化する。(最初にあるコーラの分)
- 以下の行動を好きなだけ繰り返す。
- $N \ge A_i$ であるような $i$ を1つ選ぶ(無ければ終了)
- $N ← N - D_i$
- $Score ← Score + B_i$
Scoreの取り得る最大値が答えとなる。
性質的には重さ $D_i$、価値 $B_i$、ナップサック容量 $N$ とした、 ($A_i$ により遷移可能な範囲に多少の制約が加わった)ナップサック問題で解けるが、 $N$ の初期値が非常に大きく、そのまま適用することはできない。
ただ、$N$ がある程度小さくなるまでは、最も効率の良い交換($\dfrac{B_i}{D_i}$ が最大のもの)を繰り返し選んで問題ない。
- 略証
- 最高効率の交換(の1つ)を best とする。$(A_{best},B_{best},D_{best})$
- $k$ 回交換後の $N$ を $N_k$ とする。
- $N_k,N_l \ge A_{best}$ の範囲で $N_k \equiv N_l \mod{D_{best}}$ な $(k,l)$ があったら、その間の操作は全て best で置き換えて損しない。
- 鳩の巣原理により、$N \ge A_{best}$ の範囲で best 以外の交換を使う回数は、$D_{best}$ を上限として抑えられる。
よって、$N$ が $A_{best} + \max(A) \times D_{best}$ を下回る直前までは貪欲に最高効率の交換をおこなってよい。
残りをナップサックでおこなっても、$O(\max(A)^3)$ 程度の計算量で済む。