0.はじめに
なかなかバラエティに富んだ問題がそろってました。
BにてこずったりDに絶望しつつ、Eがなんとか解けたため
レートはなんとかプラス+15と増えました。
1.A - Adjacent Product
小手調べ的な問題。
回答用のリストBを用意し、リストA内の隣接した数字を掛けたものを
Bに格納して表示するだけでACでした。
https://atcoder.jp/contests/abc346/submissions/51545214
2.B - Piano
めちゃくちゃてこずり、後回しにした上に考察が甘く
WAを3連発して時間を食われました。
【考え方】
1.配列WL(鍵盤の白部分を1とした列[1,0,1,0,1,1,0,1,0,1,0,1]の繰返し)を用意
2.配列BL(鍵盤の黒部分を1とした列[0,1,0,1,0,0,1,0,1,0,1,0]の繰返し)を用意
3.変数WSを用意しWLを先頭から足していく、その際、BLも同じ位置分BSに足していく
4.WSが入力Wと同じときのBSの値がBと同じなら、Yesを出力して終了
5.Bと違う場合、先頭から1ずらして3~4を繰り返し
6.12回繰り返してもBSの値がBと一致しない場合Noを出力して終了
1回目は、配列WLとBLが、W=100をみたすだけの長さが無かったためREに。
2~3回目は”WSが入力Wと同じとき”が、WL[i]=1の時と、その次が0の時の
2種類あることが考慮されていなかったためにWAとなりました。
自分的にはB史上一番難しくない?と思う問題でした。
https://atcoder.jp/contests/abc346/submissions/51581060
3.C - Σ
普通にやったらTLEだろうなーという思いと普通にやる方法も結構複雑だなーと
いう感じでした。
まぁ、典型的な問題なので、すぐ解法は思いつきました。
【考え方】
1.1~Kまでの累積和KS((K*(K+1))//2)を計算
2.リストA内のK以下かつ重複しない値を集計したASをKSからマイナスし出力
~ASの算出法~
1.リストAに存在する数の辞書Dを用意
2.リストAを先頭から見ていき、Dにある場合はスキップ
Dにない場合、辞書Dに登録かつ、K以下ならASに加算
といった感じですんなり解けました。
https://atcoder.jp/contests/abc346/submissions/51565374
4.Gomamayo Sequence
DPだなーと思いつつどんな集積にすればよいかがおもいつかずスルーしました。
後で解説見ながら解きたいと思います。
5.E - Paint
典型的な問題だったので、セオリー通り最後の操作優先で
算出する方法を検討。
のんびり考えてたら意外と時間が足りなくなりましたが
縦横の捉え違いとかもなく、テスト~提出まですんなりいけて間に合いました。
【考え方】
1.行列毎に塗られた順番と色を保持する辞書(WD,HD)を用意
M回分インプットして、辞書を更新(既存行は上書き)
2.WD,HDの値をリストLに(塗順,縦横,色)を格納し、降順に並べ替え
3.縦加算数=Hと横加算数=W、SortedDict(Key_色:値_枚数)CDを用意する
4.リストLを先頭から参照
縦の場合、辞書CD_KEY色の値に縦加算数を加算、横加算数を1マイナス(0まで)
横の場合、辞書CD_KEY色の値に横加算数を加算、縦加算数を1マイナス(0まで)
縦加算数と横加算数が共に0になったらリスト参照終了
5.CD内に0がある場合(0で塗られていた場合)CD[0]にWCHCを加算
ない場合且つ、WCHCが0でない場合(塗られていないマスがある場合)
CD[0]にWC*HCをセット
6.CDのキー・値を順に出力して終了
https://atcoder.jp/contests/abc346/submissions/51604645
以上