AtCoder Beginner Contest 258 E問題 Packing Potatoes
問題
提出解答
問題の概要
個からなるじゃがいもの列がある. 先頭から 番目のじゃがいもの重さは である.
このじゃがいも達を次のルールによって箱に詰めていく.
- 空の箱を用意する.
- じゃがいもがある限り以下の操作を続ける.
- その時点での先頭のじゃがいもを箱に入れる.
- 箱に入っているじゃがいもの重さの総和が 以上ならば, 箱には蓋をして新たな空の箱を用意する.
このとき, 次の 個の問に答えよ.
- 番目に蓋をした箱に入っているじゃがいもの個数を求めよ.
制約
解法1
以降では説明のため, 番目のじゃがいもが色 であるとする. このとき, 色が同じじゃがいもの重さは等しい.
ここで, 空の箱の状態から最初に箱に入れるじゃがいもの色が同じならば, 必ず最終的に箱に入っているじゃがいもの数は等しくなることに着目すると, 次の2つが (高速に) 求められればよいことがわかる.
- 各 に対して, 空の箱の状態から最初に箱に入れるじゃがいもの色が であるときの最終的に箱に入っているじゃがいもの数 .
- 個目の空の箱に入れられる最初のじゃがいもの色 .
このとき, 番目に蓋をした箱に入っているじゃがいもの個数は である.
解法2
を求めることにする. このとき, とすると, どの色から初めても色が 周する. このことから, 仮に が であった場合における空の箱の状態から最初に箱に入れるじゃがいもの色が であるときの最終的に箱に入っているじゃがいもの数を とすると, である.
について, であることに注意すると, は二分探索や尺取法で求めることにより, をそれぞれ 時間, 時間で求められる.
解法3
を求めることにする. ここで, に対して, 写像 を に対して, を以下で定義する.
- 空の箱の状態から最初に箱に入れるじゃがいもの色が であるとき, 次の空の箱の状態から最初に箱に入れるじゃがいもの色 (つまり, 最後に入れたじゃがいもの色の次の色).
実はこの は を用いることにより, となる.
このとき, である. ただし, 非負整数 と に対して,
と定義する.
このとき, を愚直に求めようとすると, 時間かかり, 到底間に合わないが, ダブリングを利用することによって, 時間で求めることができる.
具体的には次のようにして求めることができる.
- とする.
- に対して, 次のようにして を求める.
- 各 に対して, となる が (唯一) 存在する. このとき,
である.
これによって, を 時間で求めることができる.
解法4
以上から求められた 及び, から を出力すれば良い. 合計の計算量は 時間や 時間である.