3444 Wavelet Compression

Last-modified: 2011-12-07 (水) 18:57:00

原文


時間制限:5000ミリ秒
メモリ制限:65536KB

問題

貴方はウェーブレット変換の逆変換を記述しなくてはいけない。
この問題で要望されるウェーブレット変換の定義は以下のとおりである。

a(1),,,a(n)までの数列が与えられる。
この数列に対し以下の関数を定義する。

for i=1,,,n/2
s(i)=a(2*i-1)+a(2*i)
d(i)=a(2*i-1)-a(2*i)

この関数を使ってウェーブレット変換がおこなわれる。
具体的な例で示す。
5,2,3,2,5,7,9,6
という数列に対して上記の関数を適用し
s(i)=7,5,12,15
d(i)=3,1,-2,3
という結果が得られる。
この結果を繋げて
7,5,12,15,3,1,-2,3
という新しい数列Bが得られる。

貴方はさらにBの前半分4つ目まで(s(i)で得られた結果)の数列に上記と同様の操作を施し数列を更新しなくてはいけない。
次に更新されたBの半分の半分、前二つの数列に対し同様の操作を施す。
この半分だけ更新していく操作を更新する数列が2つになるまで繰り返す。

この操作の結果貴方は
39, -15, 2, -3, 3, 1, -2, 3
という数列を得る。
操作の過程を図解すると下記の表となる。

5	2	3	2	5	7	9	6
7	5	12	15	3	1	-2	3
12	27	2	-3
39	-15


例えば3行目の12,27は上の行の値を足したもの12=7+5,27=12+15であり、. 2、-3は2=7-5,-3=12-15である。
3行目の12,27,2,-3は s(1),s(2),d(1),d(2)という並びとなっている。
前4つの数列に対してだけ操作を施すわけである。
4行目では前2列だけに操作を施している。
39=12+27であり-15=12-27である。
4行目の39,-15はs(1),d(1)の結果である。

表の各列の再下端をつなげたものが最終的な変換結果となる
39, -15, 2, -3, 3, 1, -2, 3が答えである。

貴方はこの変換の逆変換を記述しなくてはいけない。
39, -15, 2, -3, 3, 1, -2, 3
から
5,2,3,2,5,7,9,6を求めるわけである。

入力は行単位で与えられれる。
各行に対して逆変換した結果を一行ずつ出力せよ
各行はまず初めに数列の長さnが与えられ(nは256以下の2の倍数である)、次に数列が与えられる。
n=0が入力の終了である。

入力の例

8 39 -15 2 -3 3 1 -2 3
4 10 -4 -1 -1
0

出力の例

5 2 3 2 5 7 9 6
1 2 3 4

出典

Rocky Mountain 2007