0.はじめに
C問題までは順調に解けましたが、Dの壁を越せず
結果はレート微減でした。
でも、レートがピッタリ700になったのでなんかうれしい感じでした。
1.A - ab
Aらしい肩慣らし問題でした。
フラグ変数を0で初期化し、文字列を2文字目から見ていく。
一文字前と現在の文字が、abかbaの組み合わせだったら
フラグに1をセット
最後にフラグが1だったらYes、0だったらNoを出力して終了。
https://atcoder.jp/contests/abc327/submissions/47210843
2.B - A^A
最初は素因数分解めんどいなーと思いましたが、
入力例とBの最大値を見て、A=10で10の10乗まで行くなら
受験を満たすAの数はそれほど大きくないなと気づきました。
Bの値を試算していき、A=17で制限である10の18乗を
超えることが分かったので、あとは、i=1から16までループして
入力のBとiのi乗が一致したらYes、i=16を超えても一致しなかったらNoを
出力して終了。
https://atcoder.jp/contests/abc327/submissions/47219480
3.C - Number Place
ナンプレは日ごろからやるので、質問の理解はすぐできました。
とりあえず、9個の配列を渡したら、その中に1~9がすべて含まれるかを
チェックする関数chkを用意。以下関数の実装内容
1.入力された配列Lを昇順ソート
2.Lの要素を結合した文字列が”123456789”を満たす時
→Trueをリターン
3.Lの要素を結合した文字列が”123456789”を満たさない時
→Noを出力して終了。
メイン処理の方は、チェックすべき、行、列、3×3のブロック毎に
配列を作り関数chkに渡す。
すべてチェックしてもPGが終了してなかったら条件を満たすので
Yesを出力して終了。
行列の実装はすんなりいきましたが
3×3のブロックを配列化するのにてこずり、結局力技で
1文字ずつ指定するというエレガントさの欠片もない実装になりました・・。
https://atcoder.jp/contests/abc327/submissions/47242365
4.D - Good Tuple Problem
問題文の言っていることが全く分からず諦めかけましたが
例題を見つつなんとか理解できた気になりました。
【考え方】(理解できた気になった考え方なので最終的な回答には未使用)
・A[i]とB[i]をペアのキューqを作っていく、その過程で、相互関係を持たない
ペアは除外する。
例:(3,1)、(3,2)、(1,2)、(4,5)とあったら、4つ目は除外
・相互関係を考慮しなければいけないqを先頭から抽出していき
それぞれの値に1or0を振っていく、すでに振られた
値に矛盾が生じる場合にNoを出力して終了
すべての値に1or0が設定出来たらYesを出力して終了
色々試行錯誤してさらに時間切れになりつつも
TLE5つまでいったのですが、その先にACはなさそうでした・・。
解説を見たところ、二部グラフという初耳な考えかたで
解法が示されていて、ざっくり理解した感じだと問題文でいうXの
リストを完成してくという考え方でした。
解説のC++を参考にpythonで実装したところ、REがでたので
いつもの再帰深度不足だなということで、setrecursionlimitを拡張し
ACとなりました。
https://atcoder.jp/contests/abc327/submissions/47280246