精進メモ 2021/04/12~
先週もモンハンしていたら一週間が終わりました。
MY FIRST STORYをにハマりました、気に入った数曲をヘビロテしていますが良いですね。
形式的べき級数
勉強を始めました。
べき級数そろそろやろうかなと思い、はまやんさんとmaspyさんの2つをとりあえず読みました。わかりやすい。maspyさんのこれくらいの問題であれば立式自体はできそうhttps://t.co/mkb951QkJbhttps://t.co/FnaY6UzIFX多項式・形式的べき級数数え上げとの対応付け
— ツバサ (@emtsu_ba) 2021年4月12日
読み終わったもの:
今年中に理解する!多項式、母関数、形式的べき級数の競プロでの実践的使い方 - はまやんはまやんはまやん
[多項式・形式的べき級数](1)数え上げとの対応付け | maspyのHP
[多項式・形式的べき級数](2)式変形による解法の導出 | maspyのHP
[多項式・形式的べき級数](3)線形漸化式と形式的べき級数 | maspyのHP
どれもわかりやすいです。
ACL contest 1 E - Shuffle Window
問題
提出コード
当時はさっぱりわかりませんでしたが今は少し考えたらあっさり解けました。成長です。
まず、を考えます。
とについて考えると、が前に来る確率がちょうど1/2になります。よって、 が答えです。
そうでない場合について考えます。
番目の要素がどちらも、ランダムに選ばれる要素の候補に含まれるようになったら、それ以降、による転倒数の増加確率は1/2になります。
なので、とすると、が候補に入る前に、の場所が確定しない確率を求めれば、
先に確定しなかった: の確率で転倒数が1増加
先に確定した: 確率で転倒数の増加は一意に決まる( であれば増加)
となるので答えがわかります。
が候補に含まれるまでに、がランダムに選ばれる試行をする回数は、回となります。
1回あたりの試行で、選ばれない確率はなので、
となります。
全てのに対して計算を行うことはできませんが、のべき乗を考えているので、区間更新が掛け算、区間取得が総和の遅延セグ木を用いることで、に対するの総和を高速に求められます。
第二回日本最強プログラマー学生選手権
C - Max GCD 2
実はちょっとハマっていました。
が存在するには、の倍数が以上の中に2つある必要があります。以上のの倍数はで求まるので、について全探索できます。
D - Nowhere P
累積和 mod Pを考えると、この値がどうなっていても、次に選ぶことができる値はパターンです。なので、のべき乗を考えれば良いです。初項のみパターンです。
E - Level K Palindrome
再帰的に考えていくと、レベルの回文について、5つめの条件を適用したか、4つめの条件を適用したかはで一意に決まっています。
は多くても20程度であり、それより大きい場合はそもそも答えが impossible
になります。
あとは、レベル0の文字列が通りほど出てきて、それらが全て一致するかつ回文でないようになる必要があります。この部分は、1か所でも反転したときに文字が一致しない箇所があればいいので、それを適当に決め打ちすると、他はだいたい貪欲に決めてOKです。
奇数長の場合、真ん中は決め打ちで使えないので注意です。
F - Max Matrix
変更箇所に対する値の差分を計算しようとすると、
数列のより小さい値の個数および、以上の値の総和が求まればいいことがわかります。
どちらも、セグ木に乗ります。要素の値はまであるので、座標圧縮が必要になりますが、ここを頑張って実装すれば通ります。
G - Spanning Tree
行列木定理らしいです。
辺を張らなければならない部分を先に張り、連結成分ごとに頂点を圧縮すると、上の定理そのもので問題の答えを計算できます。
AtCoder Regular Contest 117
久々の橙です。highest復帰までもう少しです。
A - God Sequence
正の序盤は1,2...として、最後の項をにしておくと、負の序盤は-1,-2...として、こちらの最後の項で適宜調整できます。順位表が開始直後ペナまみれだったので丁寧にやりましたが、少し丁寧すぎた気もします。
B - ARC Wrecker
並び替えを好きにしても答えは変わらないので、昇順に並べます。
ある初期の高さについて、階のある/なしの分布が一致していると、それらはどちらを選んでも全く同じ結果になります。
一方、分布が一致してない場合、とどちらを選ぶかで結果が変わります。
ので、それぞれの分布について、何回選ぶかで答えが変わります。
これは、階差 + 1の積を求めればよいです。
C - Tricolor Pyramid
見た時点で二項係数っぽいなぁという気になります(参考問題1 , 参考問題2)。
RBWに012を割り当て、これらの演算がどのようになっているかを見ると、のブロックの上には、
であることがわかります( でもいいです )
初期位置が左から番目のブロックは、1番上の段には、回影響するので、
を答えに足してあげればよいです。
が偶数のときは、で置き換えてあげましょう。
での二項係数は、3だけ別処理をして、今どれだけ3がかかっているか数えてあげればよいです。
D - Miracle Tree
初期値1のカウンターを用意し、ある頂点からDFSをはじめて、他の頂点に移動するたびにカウントを1増やします。そして、DFSをしていて、まだ値が書き込まれていない頂点にたどり着いたとき、カウンターの値を書き込みます。
こうすると、問題の条件を満たす木ができあがります。
個目の頂点に書き込まれた値が最大値です。
この最大値は、オイラーツアーで辿る距離から、任意の一つのパスの長さを引いたものになります。パスの長さが最大になるには、直径を選べばよいので、が答えになります。
ということで(↑だけだとこれが最適解の証明になっていませんが)、後は直径の端点からDFSを開始して、もう片方の端点が最後にくるようにDFSをすれば答えが求まります。