# Gori#016(ABC036)
# B - 回転
# 概要
の文字列を90度回転させて出力せよ.
# 解法
- の入力をに変換してやれば良い.
- 出力部分は以下の通り.
for(int wi=0;wi<n;++wi){
for(int hi=n-1;hi>=0;++hi){
cout << s[hi][wi];
}
cout << endl;
}
# C - 座圧
# 概要
- が与えられた時, 座圧した結果の文字列に変換して出力せよ.
- e.g.)
- 3 3 1 6 1
- ->
- 1 1 0 2 0
# 解法
ソートして1から割り振ればよい.
が, これは長いので, std::map
を用いた公式解にしてみる.
mapに,...,をキーとして追加
mapではキーが小さい方から
0, ..., n
を割り当てるmapのa_1, ..., a_nを参照する.
# D - 塗り絵
# 概要
- 個の島が本の橋で繋がっている.
- この時, 各島を白と黒を使って色塗りする時の塗り方は何通りか?
- ただし, 橋の両端の島が黒になってはならない.
# 解法
Editorialに沿って解く.
頂点, 辺なので, このグラフは木であることがわかる.
その上で, 木の任意の頂点の通り数を, その頂点の子の通り数を用いて表したい( DPの漸化式を作りたい)
を以下のように定義する.
頂点を根とする部分木を白と黒で塗る時の通り数.
(ここで, 頂点は白でも黒でも良い)
頂点を根とする部分木を白と黒で塗る時の通り数. (ただし, 頂点は黒でなければならない)
# 頂点が白の時
頂点が白だった時を考える.
頂点が白の時, その子は白でも黒でも良い.
したがって, 頂点の子をとすると,
この時の頂点の通り数は, となる.
この式の意味は, 具体的に書き出してみれば分かるので, そこは紙にでも書いてみると良いと思う.
# 頂点が黒の時
頂点が黒だった時を考える.
頂点が黒の時, その子は白でなければならない( 題意).
したがって, 頂点の子をとすると,
この時の頂点の通り数は, となる.
# 一般化
この上で, 頂点の色の指定がないは以下のように定義できる.
また, 頂点が黒と指定されているは, 子が全て白と確定しているため, 以下のように定義できる.
を用いると, $f(x)はさらに短くでき, 一般化した式は以下のようになる.
これを実装すればよい.
お疲れ様でした.