2022年6月30日木曜日

日鉄ソリューションズプログラミングコンテスト2022(AtCoder Beginner Contest 257)

  Eまで五完。

コンテスト後のツイート

 F - Teleporter Setting

 解法ツイートを見てAC。

 スタートとゴールから各点への距離を求めておく。テレポートするとき、利用したい点は、スタートかゴールかのいずれかに近い点なので、それぞれ最も近い点を求めておく。

 ここで、未定の点がxと決まったとき、テレポートの使い方は、

・1→(1に近い点)→x→N
・1→x→(Nに近い点)→N
・1→(1に近い点)→x→(Nに近い点)→N

 の三通り。
 この三番目の場合に気付かなかったため解けなかった。
 別な問題を考えたりしてちょっと時間を置ければ気付けた気もするけど、そういう余裕がなかったね。

G - Prefix Concatenation

 解法ツイートを参考にローリングハッシュ+二分探索を書いたがTLEが取れず。
 解説を見て、KMP法を使ってACした。(Z-algorithmを使う方法は理解していない)

 色々な文字列アルゴリズムはがあるけれど、ローリングハッシュ(とManachar)以外は(コードの書き方だけでなく)内容も思い出せなくて困る。

 困るんだけど、ローリングハッシュでどうにかなることも多いから、ちゃんと覚えなきゃ、という気にもならないんだよね……。

2022年6月28日火曜日

AtCoder Regular Contest 143

 Cまで三完。

コンテスト後のツイート

C - Piles of Pebbles

 コンテスト中は、(まずちょっと考えて一度飛ばそうかとDに行き、分からず戻った後)、

・再帰で愚直解を書く
・書いてみたら、X=Y=1のときは見たことある結果になる
この問題を思い出し、解説を読む。
・大体同じように解けそう、と分かり、(愚直解と一致するか試した後)AC

 という流れでした。

 類題を覚えていたのは、当時嘘解法でACしたためです。嘘解法でACすると、記憶に残りやすいので良いかも?

D - Bridges

 解法ツイートを見てAC。

 コンテスト中、最初は(問題文通り)2N個の頂点があるグラフを考えていたけれど、Cを解いて戻った後は、N個の頂点のグラフで考察すべきでは? とは思い直した。N頂点のグラフで、多くの頂点がサイクルに巻き込まれるような辺の貼り方をすれば良さそう……と思うも、最小循環費用流? とか考えたりして、やり方が分からなくなってしまった。

 落ち着いて見れば、これはDFSする(DFS木を考える)だけで良い。
 こういったDFS系の問題は落とすことが多いので注意しようと思っていたのに、また解けなかったというのは悲しい。最初、2N頂点のグラフを考えていたために引きずられた、という部分はあるが、これは思いつきたかった。

E - Reversi 

 解説放送を見てAC。

 葉について考察し、それをもとに木DPをすればOK。

 葉については考えたけど、それを元に有効辺を付けようとは考えなかった。石を取り除けるかどうかの判定をどうやるんだろう、と考えるだけでなく、辞書順最小の裏返し方をどう見つけるんだろう、と考えたなら有効辺にするのは結構自然かもしれない。

 まず判定をどうにかしよう、と思ってしまうけど、(この問題に関しては)辞書順のことも考えて臨むべきだったのかな。

2022年6月25日土曜日

yukicoder contest 349

 Cまで三完。


No.1989 Pairing Multiset

 解説AC。具体例・図もあり、解説が分かりやすかった。

 解説を箇条書きにすると、

・Sが定まっているとき、f(S)はソートして二つずつ組みを作っていけば求められる
・多重集合はソート済み配列と同一視できる。
・ソート済み配列は、グリッド上の経路に対応させられる。(ので、その個数は、経路数と対応する)
・グリッド上で、ある縦の線に対応する経路数の和として数えられる
・あとは計算量削減パート

 という感じか。
 
 四点目・五点目は簡単ではないけど、三点目までたどりつけばこういうことは考えそう。
 なので、二点目・三点目が思いつけるかどうか、という気がする。

 「多重集合やソート済みの配列はグリッド上の経路に対応させられる」は時々見かける内容だと思うので、押さえておきたい。

2022年6月21日火曜日

東京海上日動プログラミングコンテスト2022(AtCoder Beginner Contest 256)

 Eまで五完。

コンテスト後のツイート

 F - Cumulative Cumulative Cumulative Sum

 解説AC。

 とりあえず立式すればその先が見えてくる問題。
 コンテスト中はこの問題を飛ばしてGへ行ったけれど、Fを考えていれば解けたかというと怪しい。

G - Black and White Stones

 解説AC。

 「各辺に置く黒い石の個数を固定したらDPで解けるのでそれを足し合わせれば良い」と言われれば難しくない。
 コンテスト中は、なんか上手い方法があるのではと思い、「ポリアの数え上げ定理」を調べたりして迷走していた。

 落ち着いて問題を見直してみると、特に対称性のある問題ではない。Dの制約が小さいことに注目して、各辺に置く黒い石の個数を固定して解けば良いのでは? と考えてみるべきだった。

2022年6月17日金曜日

Codeforces Round #800 (Div. 1)

 Cまで三完と思いきや、Cがシステムテストで落ちて二完。

コンテスト後のツイート

C. Keshi in Search of AmShZ

 自力AC。

 解法ツイートで「どの道を進んだとしても最低x歩で行ける」と書いたけどこれじゃ考察不足。ダイクストラで今までに見た辺の行き先は、今見ている辺の行き先よりDPの値が小さい(もしくは同じ)なのだから、ブロックしなくてもOK。それ以外を除外したときに、歩数が小さくなるかどうか考えればOK。

 これは、コンテスト中も頭をよぎったのだけど、なぜか必要ない気がして考えずに提出してしまった。pretestでWAが出てたら気付けてACできた気がするので悔しい~。

AtCoder Regular Contest 133

 Cまで三完。

コンテスト後のツイート

D - Range XOR

 kaageさんのブログの解法を参考にしてAC。

 累積xorの性質として、偶数とその次の奇数のxorは1とか、偶数から四つ連続したもののxorは0といったものは有名。それを使う問題なのは分かるけれど、詰めるのは大変。
 最終的に桁DPになりそう、というのも分かるが、使うところまで詰めるのも難しい。

 上のkaageさんのブログの解法では、l, rを偶奇で分類し、「lが奇数、rが偶数」のときだけ桁DPで処理している。(他の場合は、最初に書いたxorの性質を用いて処理)

 ただ、私は、桁DPは下の桁で場合分けしてメモ化再帰を使って実装した。

 calc(L, R, x, eqflag)で、「L以上R以下の数iに対して、i^xもL以上R以下であり、eqflag=1なら、i<=i^x、eqflag=0ならi<i^xとなるような場合の数」とした。

 不等号の計算を間違えたためちょっと実装に苦労してしまったが、この問題だと下の桁を場合分けする実装の方がやりやすいと思う。

yukicoder contest 342

 ABの二完でした。


No.1929 Exponential Sequence

 半分全列挙。

 このキーワードさえ思い浮かべばそう難しくない問題なのに、全く思い浮かばなかった。反省。

No.1930 XOR of Two Range

 自力AC。

・xが偶数のとき、x^(x+1)=1

 という事実を知っていれば、L+R以外は大体打ち消し合いそうだというのは分かる。その後は、周期性を実験して求めるのが簡単。