2024年4月28日日曜日

AtCoder Regular Contest 176 (Sponsored by Mynavi)

 Cまで三完。ARCでこれくらいの順位が取れると嬉しい。

コンテスト後のツイート

D - Swap Permutation


 解法ツイートで行列累乗で解けるというのを目にしたが、ある(a,b)というペアが最終盤面でどのような位置にあるか? という遷移を考えてしまい、上手くできなかった。

 index i, i+1が最終的にどの数字になっているか? に着目するのは言われてみれば自然。コンテスト中に解けなかったのは仕方ないにせよ、行列累乗で解けると言われたら思いつきたかった。

2024年4月25日木曜日

Educational Codeforces Round 163 (Rated for Div. 2)

 Eまで五完。

コンテスト後のツイート

F. Rare Coins

 解説AC。

 自分になじみのない解法が必要かと思って解説を見たのだが、普通の方法で解けた。

 ちゃんと問題を整理し、1/2の確率で自分のお金が増える、相手のお金が増える、というのを元のお金を調整して、「1/2の確率で差を減らす」と解釈するとシンプルな二項係数の和になる。










2024年4月23日火曜日

Codeforces Round 940 (Div. 2) and CodeCraft-23

 Dまで四完。ARCの後だったこともあり、前半は休み休みやっていた。

コンテスト後のツイート

E. Carousel of Combinations

 解説AC。

 Combi(n, k)*(k-1)! mod k の和を求める問題。実験コードを書いてこれを計算してみると、k=4と素数のとき以外は0になること、かつ、規則的に値が変化することが分かる。kを固定したとき、最初に値が正になるのはn=kのときで、k-1。そこからkごとに-1し、0になったらまたk-1に戻る。(これはkが素数のとき。k=4は2と0を交互に取る)

 これが分かった後、埋め込みか? などと考えてしまい解説を見てしまったが、累積和を二回やるのが正しかった。規則的に値が変化するのだから、累積和を考えるのは自然。

 大体解けたけどTLEが微妙ってとき、変な手法を考えてしまうのは悪い癖。まともに計算量を減らす手法を考えるようにしないといけない。






2024年4月22日月曜日

AtCoder Beginner Contest 350(Promotion of AtCoderJobs)

 G解けず。Fで苦戦したため順位は悪い。

コンテスト後のツイート

G - Mediator

 解説AC。

 マージテクで解いた。コンテスト終盤にマージテクが使えるんじゃないか? というアイディアは思いついたけど、具体的な解法には思い至れなかった。

2024年4月20日土曜日

yukicoder contest 428

 Dまでの四完。Eが解けそうで解けず、FはTLEに苦しむ。



No.2732 Similar Permutations

 4で割った余りで分類し、同じものが二つあれば1,2を入れ替えて置けばOK。
 ただし、Nが5以上ならこれでOKだが、Nが小さいときはこれだと答えが探せない場合があるため全探索。

 コンテスト中、こういう解法を考えたがWAが出たので、何か考察ミスがあるのだろうと別の解法を探してしまった。
 が、コンテスト後、改めて考えて見ると正しそうな気がし、コードを見直したら実装ミスに気付いた。(Nが小さいとき全探索する部分でミスがあった)

 これで提出したがWA。
 Xで割った余りが3や4の場合は、1,2を置くのではダメですね。2,3を置くようにしてAC。

 解説を見たら、2で割った余り(つまり偶奇)が同じものが二つあれば、上と同じような議論ができるらしくびっくりした。

No.2733 Just K-times TSP

 各頂点を何回通ったかと、最後に通った頂点を持ってDPすれば良い。PyPyだと制限時間が厳しく、コンテスト後に定数倍高速化を頑張ってなんとか通した。

 しかし、writer解がPyPyで、シンプルかつ高速に書けていた。こういう風に書けば良かったのか……。
 同じような風に書こうとして上手くできず、itertools.productを使ったのだが。

No.2734 Addition and Multiplication in yukicoder (Hard)

 自力AC。

 ちょっと実験してみると、最終的にできる数字はA[i]たちを適切に並び替えたものになると分かった。
 なら、A[i]を文字列とみてソートし、その順に置いて行けば良いのかと思ったがこれだとWA。

 よく考えると、"2"と"21"なら"21"の方が先に置いた方がお得。

 じゃあ、"2"は"22222222222222222"として"21"は”212121212121212121"のように元の数字を繰り返したものとして判定すれば良さそう。こうみなしてソートした後、並べていったら(TLE、MLEにちょっと苦しんだけど)ACできました。

2024年4月18日木曜日

AtCoder Beginner Contest 349

 Eまで五完。Eまでが速かったのでギリギリ黄色に復帰できました。

コンテスト後のツイート

F - Subsequence LCM

 素数の個数でいけるというのを手掛かりにAC。

 ゼータ変換を使う方法は思いつかなくても、DPで素数の個数^2でやる方法は難しくなかった。これはコンテスト中に落ち着いて考え直していたら通せていたはず……。

 



2024年4月15日月曜日

Educational Codeforces Round 164 (Rated for Div. 2)

 Dまで四完。

コンテスト後のツイート

E. Chain Reaction

 解説ツイートを見たところ、√max(A)回加算するというところは合っているみたい。
 →落ち着いて書き直したら答えがあった。

 ただし、PyPyだと制限時間が厳しく、PyPy2で2999msでACした。ルートだけでなくlogもかかっているからねぇ。二分探索使わない方法はあるのだろうか……と書いていたら、使わなずにできそうな気がしてきた。

 a/xの繰り上げが変化する場所をメモしていけばいい(後で累積和を取る)ので、前半はxを一個ずつ増やし、後半はa/xの値を一個ずつ減らしていけば良さそうです。