ARC065 D - 連結 / Connectivity
解法
UnionFind木を貼ると解ける問題です。
鉄道について、辺をそのままUnionFind木に反映させると、根が同じ都市については、連結であることになります。
道路についても同様です。ということで、まずはUnionFind木を2つ用意し、鉄道と道路それぞれについて辺を付け足していきます。
あとは、鉄道と道路両方の根が一致する個数を数え上げます。
mapを用意し、鉄道と道路の根のペアをキー、そしてそのようになる都市の個数を紐づけていきます。
n個の都市すべてについて道路と鉄道の根のペアを求め、mapにおいて対応する場所に+1していくことで、出力の際にmapで対応する場所を見るだけで答えが求まります。
ABC048 D - An Ordinary Game
問題
提出コード
グランディ数を利用する問題は、ぱっとみで使うだろうなーというのがわかっても、そこから答えに結び付けるのが難しくていつも解くのに時間がかかります…
解法
お互いが操作できなくなる状態では、必ず2種類の文字になっていて、それが交互に並んでいるような状態になります。
ababa...のような状態です。
ababacacaca...やababcaca...のような状態でも、まだまだ文字を削除できます。
このことにさえ気づくことができれば、あとはいけると思います。
このようなパターンでありうるのが、
ababab...baという、両端がそろっている状態、もしくは
ababab...abという、そろっていない状態です。
そして、両端の文字を消去することができないという問題の条件から、どっちになるかは初めから決まっています。
前者のパターンでは、最終的に文字数が奇数に、後者では偶数になります。
また、最初の文字の偶奇は簡単に調べることができるので、お互いが最善を尽くしたときに消去できる文字数の偶奇がわかります。
この偶奇が、結局は勝者を決めることになります。
ということで、初期状態の文字数の偶奇と、両端が同じ文字であるかどうかを2進数で表し、2つの排他的論理和をとると、勝者がわかります。
ABC047 D - 高橋君と見えざる手 / An Invisible Hand
問題
提出コード
デバッグ出力と一緒に答えの出力を消してしまわないように注意しましょう。
解法
高橋君が最大の利益を得るとき、売る町と買う町は1つずつで、それぞれT/2だけ買い、T/2だけ売ることになります。
売値と買値の差が一番大きい場所が、その売る町と買う町になります。
その際、利益を1円下げるには、このどちらかの値段を1円ずらせばいいことになります。
ですが、(売値-買値)が最大になる場所が複数箇所存在しているとき、その複数箇所それぞれについて、売る町もしくは買う町のどちらかの値段をずらす必要があります。
また、問題のがすべて異なるという条件から、候補の売る町(もしくは買う町)が同じ町になることはありませんので、例外を考慮する必要はありません。
よって、あとはその候補の個数を調べればよいです。
まずは、(売値-買値)の最大を求めます。
~の中での最小値を、から引いたときが最大値の候補になりますので、これをすべてのについて行えばよいです。これはで求められます。
利益の最大値(とします)が決まったら、あとは売る町と買う町のペアの個数を求めます。
mapを使い、までに、となるようなが存在するかどうかをしらべ、存在したらカウントを増やしていけば良いです。
このカウントが、最終的な答えとなります。
ABC113 D - Number of Amidakuji
問題
提出コード
DPをします。
まずは、下準備をします。
ある高さについて、幅がのとき(つまり、本の棒があるとき)に、横線の置き方がいくつあるかを計算します。
これをとします。
のとき、横線はおけないのでです。
のとき、横線を置くか置かないかの2通りです。よってです。
のときについて考えます。
横線を置くと1、置かないと0とすると、
00,01,10の3通りです。
です。
これ以降については、実はフィボナッチ数列のようになっています。
幅がのとき、一番右側に横線を置くか置かないかで場合分けをします。
横線を置かないとき
一番右端を除く、の幅についての置き方を考えればよいので、これは
になります。横線を置くとき
一番右端に横線を置くと、その左側は自動的に横線を置くことができなくなります。
残ったの幅については自由に置くことができるので、これは
になります。
ということで、
となります。
の最大値が8なので、これは手計算で求めてもいいですし、プログラムを書いてで求めてもいいと思います。
さて、答えの数え上げをしていきます。
一番上の高さのときに、一番左の棒からスタートしたときに、上から番目の高さにいるときに、左から番目にたどり着くようなものの個数
とします(は0-indexedとします)。初期状態は、です。
すると、
のときに、、、の3つのどこかにいる必要があります。
それぞれ、のときに、左上、真上、右上にいて、そこから横線を通り(または通らず)、今の場所に移動します。
左(右)上から移動してくる場合
考えることは同じなので、今回は左上から移動する場合についてのみ考えます。
番目の棒線にたどり着くとき、との区間に横線を引くため、とおよびとの区間には、横線があってはいけません。
ですが、それ以外の部分は自由に横線をひくことができます。
この部分は、より左側と右側に分割することができ、幅がそれぞれ
とになります。
ということで、この二つの幅についての横線の置き方は、を参照することで求められます。
あとは、その二つとを掛け算すればよいので、
となります。
同様にすると、右上から移動するパターンは
となります。移動せずに降りてくる場合
の左右には横線があってはいけません。しかし、それ以外は横線を自由に置くことができます。ということで、次のようになります。
ということで、この3つの式の和がの値になります。
これを計算していくと、答えがにあります。