0.はじめに
久々のスポンサー的なのがついていないABCでした。
C問題の解法が分からず飛ばしてD問題に取り掛かったらすんなり解けました。
ABDを回答した結果レートは±0でした。
1.A - CAPS LOCK
言語の教科書に載っていそうな問題だなと思いつつ
大文字に変換する関数をググって回答しAC
https://atcoder.jp/contests/abc292/submissions/39407992
2.B - Yellow and Red Card
イベント発生型の問題ではありますが、内容自体は簡単な問題。
カードをもらった選手番号をキー、もらったカード状態を値にした辞書を作り
イベント毎に辞書更新・参照をする形で実装しAC。
https://atcoder.jp/contests/abc292/submissions/39413956
3.C - Four Variables
コンテスト中は解法がわからず時間切れ。
その後解説を見て、なるほどと思いつつ、
解法が分かればプログラム的には簡単かとも思いますが
なかなか難易度高いなと思いました。
解法についてもN√N解法まではついていけましたが
より高度な解法は理解できませんでした・・。
【考え方】
・X+Y=NをみたすX(1~N-1)、Y(N-1~1)をループさせ
それぞれのXとYについて
Xを成り立たせるABの組み合わせの数xと
Yを成り立たせるCDの組み合わせの数yを求める
それぞれのXとYの組み合わせの中でxyがそのXとYの
組み合わせを満たすABCDの組み合わせ数となる。
・ABの組み合わせ数xの求め方
例えば、X=12の時
添え字jを1からカウントアップさせていきjBが成り立つ
→X%j==0かどうかを判定し、成り立つ場合はxに1を足す
X=12の時X%j==0が成り立つのは1,2,3,4,6,12
組み合わせとしては、1-12、2-6、3-4となるため
N<=JJ(N=12までの場合J=3)までをチェックし
倍にすればxは求められる。
N=J*Jを満たすような場合は組み合わせが一つ減るので
その点は考慮する。
素直に実装した場合もACとなりましたが、その後ちょっとだけ工夫して
Xの時のx、Yの時のyを記憶しておけば
X<Yとなった場合の計算が不要となるため
辞書にXの時のxとYの時のyを覚えさせておくようにして
処理時間は半分になりました。
https://atcoder.jp/contests/abc292/submissions/39454695
4.D - Unicyclic Components
問題を読んで、ユニオンファインドを使って
同じ根を持つ頂点数を求め
辺の部分は、各辺毎に頂点u(vでもいいけど)が
属する値を求め=辺が属する根とし
それぞれカウントして同じ根を持つ頂点数=辺数を満たせば
Yes、満たさなければNoとしたところAC頂けました。
https://atcoder.jp/contests/abc292/submissions/39432516
参考サイト:https://procon.fun/code/unionfind-cycle/
以上