二倍に伸びる配列
整数を入れる伸びる配列を自分で作る。
配列は要素の数(サイズ)と、メモリを借りておいたマスの数(容量)を別々に持つ。
最初はサイズが 0、容量が 1 である。
命令は四つある。
- push x:サイズが容量と同じなら、まず容量を 2 倍に増やしてから(増やし 1 回)、末尾に x を入れる。
- pop:空なら empty を出力する。
そうでなければ末尾の値を取り出して出力し、そのあと容量が 2 以上で、サイズ×4 が容量以下なら容量を半分に減らす(減らし 1 回)。
- get i:0 から数えて i 番目の値を出力する。
i がサイズ以上なら out of range を出力する。
- info:サイズと容量を空白一つで区切って出力する。
一行目に命令数 q、続く q 行に命令が一つずつ与えられる。
命令ごとに上の出力を一行ずつ行い、最後の行に「grow 増やした回数 shrink 減らした回数」を出力せよ。info が出力する容量は、いつも上の規則で決まる値である。
C は realloc で借りたブロックの大きさを変え、C++ は容量を変数で自分で数えながら、std::vector の reserve でその分を前もって借りてみよう。
- 入力
- 1 ≤ q ≤ 100,000、-1,000,000,000 ≤ x ≤ 1,000,000,000、0 ≤ i ≤ 100,000(整数)
- 出力
- push 以外の命令ごとに一行、最後の行に「grow G shrink S」
9 push 4 push 8 push 15 info get 2 pop pop info get 1
3 4 15 15 8 1 2 out of range grow 2 shrink 1