0.はじめに
今回はD問題まではそこそこの難易度で
久々に4問正解達成。
レートも+38でした。
40分残してE問題にたどり着いたけど、ちょっと難しかったです・・。
1.A - Shift
サーッと問題読んで、A問題だから素直に
ループしてもいいとは思いつつ
若干手を抜きました。
N個の0数列の先頭から、
インプットしたA数列のK個目から最後までを入れて
最後にアウトプットする。
といった感じで実装しました。
https://atcoder.jp/contests/abc278/submissions/36605710
2.B - Misjudge the Time
どう考えても時計のデザインが悪いだろ・・・。と思いつつ
以下のように実装。
1) 見間違えやすい時刻(以下ダメ時間)になるまで以下をループ
1-1)現在時刻、時間Hと分MをA,B,C,Dに分解してダメ時間判定
1-1-2)A&Cが時として見られるか判定
-Aが1以下ならOK
-Aが2の時はCが3以下ならOK
1-1-3)B&Dが分として見られるか判定
-Bが5以下ならOK
1-1-4)1-2と1-3がOKの時、ダメ時間と判定してループを抜ける
1-2)現在時刻がダメ時間でない時、1分進める
1-2-1)Mが59の時
1-2-1-1)Hが23の時
-Hに0をセット
-Mに0をセット
1-2-1-2)Hが23以外
-Hに1加算
-Mに0をセット
1-2-2)Mが59以外の時
-Hに1加算
2)ループを抜けたら、現在時刻を表示
最初、なぜか、1-1-3でBが6以下ならOKとしてしまいNGでしたが
すぐに気づけて修正してACでした。
なかなか面白い問題でした。
https://atcoder.jp/contests/abc278/submissions/36617488
3.C - FF
最近のC問題にしてはやさしめの問題だなと思いつつ取り掛かる。
【考え方】
フォロー用の辞書dictを作成し
フォロー情報がはいったら(T=1)、A*(1010)+Bをキーに
dictへ値1で登録(or更新)
フォロー情報が消えたら(T=2)、A*(1010)+Bをキーに
dictを検索し、値0に更新
フォローチェック(T=3)の時は、A*(1010)+Bと
B*(1010)+Aをキーにdictを検索し、
どちらも値が1だったら”Yes”を
それ以外なら”No”を表示
単純に実装しましたが、特にTLEにもならず一発合格でした。
https://atcoder.jp/contests/abc278/submissions/36623769
4.D - All Assign Point Add
一見考え方自体は簡単そうだったので、TLE回避問題と思いつつ
まずは素直に実装。
【考え方1】
入力数列をリストAに保存
クエリ1の時
リストAをxで初期化
クエリ2の時
リストA[i]にxを加算
クエリ3の時
リストA[i]を出力
上記実装で7/15のTLE。
まぁ、リストAの初期化が時間を食っているんだろうなと
新たな考え方を導入。
【考え方2】
クリア時変数QL(初期値-1)を用意
ついでに加算用辞書dictを用意
入力数列をリストAに保存
クエリ1の時
QLにxをセット
dictを初期化
クエリ2の時
dict[i]にxをセットor(すでにあれば加算)
クエリ3の時
QLが-1の時
リストA[i]+dictiを出力
QLが-1以外の時
QL+dictiを出力
上記回収でACゲットでした。