2022年5月31日火曜日

AtCoder Regular Contest 141

  ABの二完。

コンテスト後のツイート

C - Bracket and Permutation

 解説AC。
 公式解説の方法は全く考えなかった。

 辞書式順序の条件がなくても、PとQを満たすような括弧列というだけでそこそこ括弧列が絞れる。そのため、そこだけに注目してしまいがち(だし、実際そこから解いた人もいるようだが、その解法はよく分かっていない)だが、PやQが辞書式順序で最小・最大であることを利用しつつ絞ろうとすると解法の方法が思いつける(のかもしれない)。

D - Non-divisible Set

 解説放送を見てAC。
 各数を2ベキで割った余りで分類するのが重要で、その処理をした後は割合自然な考え方だと思った。

 が、実際は、分かった(つもりになった)後も実装で苦戦。全部が”No"(つまり、良い集合を一つも作れない)かどうかを判定するのが結構難しかった。

E - Sliding Edge on Torus

 解説放送を見てAC。
 Union-findを使うことはコンテスト中も思いついたが、同じグループ同士に辺が貼られた場合の処理が面倒くさそうで避けてしまった。

 だが実際は、重み付きUnion-findを知っていればたいして面倒ではなかった。

 振り返ると、C~Eの中では一番ACできた可能性があったか。

 長いことこのライブラリを使っていなかったので、本当に思いつけたか、という不安はあるが、この三問の中では一番自然な発想で解法に至れるし、ライブラリがあれば実装も大変でない問題だったと思う。

2022年5月30日月曜日

NOMURA プログラミングコンテスト2022(AtCoder Beginner Contest 253)

 Fを飛ばしてGまでの六完。

コンテスト後のツイート

F - Operations on a Matrix

 イベントソートなどと言ったキーワードを見てAC。

 この問題は、

・query 3 i j の直前に現れる query 2 i xがあれば、それを覚える
・上で求めた二つのクエリの間で、query 1 l r x (l<=j<=r) というものの総和を求める

 ということができれば解ける。

 で、二つ目がクエリを後ろから見ることで求められることは分かっていた。
(けれど、ちゃんと、後ろから見て、query 3 i jが出たときに、列jに加わった和をマイナスしなくてはいけないことに気付いていたか? というと気付いていなかったかもしれない)

 そして、一つ目は、予め求めておけば良いですね。
 こうして整理して書いてみれば気付くのは難しくなく見えるので、ちゃんと整理するのが大事ですね。

2022年5月28日土曜日

yukicoder contest 345

  ABの二完。


No.1959 Prefix MinMax

 解説AC。

 ……なのだが、

・「0 1 0 1……」のような交互のクエリを投げること

 は考えたし、

・返ってきたBで、B[i]!=B[i-1]ならi項目が確定できること

 には気付いていた。

 これでは全部の項が確定しない気がして投げなかったのだけど、解説を読めば確定することは簡単に分かる。
 この二回で確定するのでは? と疑って、証明を試みるべきでした。

No.1960 Guruguru Permutation

 解説AC。

 順列からグラフを考えるのは典型だが、その後のK=0の場合の数え上げも分からなかった。サイクルが定まっているときの順列の数え上げってこうやって求めるんですね。

 また、M, Kとも正の場合についてもちょっと苦戦。
 MとKそれぞれから互いに繋げるものをx個ずつを選んだ(二項係数で求まる)後、それらをどう結ぶ(x!になる)か、と決めれば良い。

 そのそれぞれの場合の数がどうxを選んでも同じというのもちょっと不思議に感じた。

2022年5月27日金曜日

モノグサプログラミングコンテスト2022(AtCoder Beginner Contest 249)

 Fまで六完。

コンテスト後のツイート

G - Xor Cards

 解説AC。非常に苦労した。

 基底の個数が高々60個になるというのは気付かなくてはいけないが、その後の部分問題も難しい。自力が問われる。

 Nが60のとき(つまり、三乗でも良いというとき)どう解けば良いかは、桁を意識して考えれば良い。(桁DPではないけれど、桁DPするような気持ちで)

 60個の基底を表の数が大きい順に並べた後、「その基底を使ったとき(つまり裏の数のxorがかかる)どうなるか?」「使わなかったときどうなるか?」を場合分けして考える。
 ただ、「ある基底を使ったときどうなるか?」を考えている中でも上の二つの場合分けをするのだが、そのときは挙動が違うに注意。
 今まで使ったもの達の表の数のxorがKを超えているかどうかで場合分けをしなくてはいけない。

 また、表の数に0が含まれている場合がコーナーになっている。これにも注意しなくてはいけない。

 解法に至るまでも難しいが、コーナーに気を付けて実装しなくてはいけないのも厳しい。ACに至るまではかなり大変だと感じた。

2022年5月25日水曜日

AtCoder Regular Contest 140

 Cまで三完でした。D、Eは類題があったらしいが、どれも解いたことがなかったよう。

コンテスト後のツイート

D - One to One

 類題の解説も参考にしてAC。

 コンテスト中はこれを飛ばしてEに行った。類題経験がなければかなり難しい問題だと思うので、Dに行っていても解けていなかったと思う。

 「サイクル数を数えれば良い」というところを思い付けばそれ以外の部分は典型かもしれないが、あまり思いつけた気がしない。
 

E - Not Equal Rectangle

 類題を参考にAC。

 似たような構築をしたことがないと思いつけないと思う。こういう構築方法もある、と頭に入れておくべきか。
 理論的なことはmaspyさんが記事にしているが、射影平面がピンと来ずまだよく分かっていません……。
 

2022年5月23日月曜日

Codeforces Round #793 (Div. 2)

 Cまで三完。

コンテスト後のツイート

D. Circular Spanning Tree


・まず、Sを最後が1になるように循環させておく。
・後は順番に見ていく。iと繋ぐのは、i未満でパリティが条件を満たしていない最大のものを選ぶ。そうでなければ一つ手前のものにする。

 この方法だと、コードが書きやすいし、これで上手くいくという証明も簡単でした。

AtCoder Beginner Contest 252

  Fまで六完。

コンテスト後のツイート

G - Pre-Order

 解説を参考にAC。

 コンテスト中考えたことは次のような感じだった。

・「1 2 3 4 5 7 6」という列が与えられ、1から4までは順に一つ前の数が親になったとして、5の親が1になるとすると、(1の最初の子孫である2と3と4を無視して)「1 5 7 6」という配列について考えれば良い。

 これそのままだと(答えは一致するけれど)計算量が上手くいかない。この後、コンテスト中は迷走してしまったが、これを区間DPを用いて高速化しようと考えなくてはいけなかった。

 上では、「1から4までは順に一つ前の数が親になったとして」と、この部分も順に考えていたが、ここは「2 3 4」という配列を考えればOK、と気付くのが重要。

 すると、「1の子として2があるが、その次の子が5」だったとき、求める個数は「2 3 4」と「4 5 7 6」という列の個数の積になる。ここで、「5 7 6」でなく、「4 5 7 6」なのは、この後に出てくる7や6が1に繋がる可能性があるため。一番はじめの数字は何でもいいのだが、区間DPにするため、5の前の数字である4を便宜的に書いている。

 このようにすると、与えられた数列の区間の値により、大きい区間の値を求められると分かったので、区間DPができる。


yukicoder contest 344

 最後二問残しの13完。

コンテスト後のツイート


No.1954 CHECKER×CHECKER(2)

 解説は見たけど、(パッと読んだだけではよく分からなかったので)大体自力でAC。

・まず、市松模様の片方のマス達を反転させる。
・S[i][j]とS[i+1][j]が異なる色なら、iまでの範囲を反転させる操作が必須。(jについても同様)
・S[i][j]とS[i+1][j]が異なる色なら、全てのjについてS[i][j]とS[i+1][j]は異なっていなくてはダメ。(jについても同様)

 を実装したらACでした。

 これで必要十分なのかはあまり分からずに書いたけれど、これで大丈夫そうですね。

 解けても良かった問題ではあるのだけど、もっと「これ」というような典型手法を使うんじゃないかと思ってしまい、こういう方向性では考えていなかった。

No.1955 Not Prime

 解説で2-SATだということを知ってAC。
 2-SATを使うのが久しぶりで、内容を忘れていた。

 論理式をCNFに変形し、$(a\vee b)=(\neg a \rightarrow b)\wedge (\neg b \rightarrow a)$と変形する。$\neg a $から$b$への辺と、$\neg b$から$a$の辺を貼り、SCCを作って、$x$と$\neg x$が同じ強連結成分に含まれないか調べる、という流れ。

 今回は、「Sに含まれる」を$x$とすると、「Tに含まれる」が$\neg x$となることに注意して論理式を書けばOK。

 2-SATだと分かった後も苦戦してしまったのは反省。

 

2022年5月22日日曜日

2022 TCO Algo Round 2A

 Easyのみだがレート的には軽傷で済んだ。

コンテスト後のツイート

 Medはコーナーに気付けなかった。ちょっと修正も面倒くさそうなので、ACしていない。
 Hardは半分全列挙らしい。半分全列挙自体は考えたはずなのに、それでいけると思えなかったのは良くない。ただ、PythonでACするのは無理だろうから、どっちみちC++で書き終えることはできなかっただろう。

2022年5月20日金曜日

Codeforces Round #792 (Div. 1 + Div. 2)

 Eまで五完。コンテスト終了五分後くらいに書き終わったGが(ANSの長さ書き忘れいてたのでそこを修正して)コンテスト後提出したら通った。惜しかった……。

コンテスト後のツイート

C. Column Swapping

 上の解法ツイートだとちょっと分かりにくいけど、

・A[i]>A[j]となっている(i, j)の中で、iが一番小さくてjが一番大きいような奴を試した

 ということです。

G. Euclid Guess

 コンテスト後提出したら通ったが、本当の解法はフローらしいので、どうやら嘘解法?→嘘解法でした!

・ソートして、大きい方から貪欲に、自分以上の数字のものだけで答えを作れるなら作っていく、という方針

 で通しましたが、

4 80
2 3 30 33

 でHackされました。
 「2と30」と「3と33」を組みにしなくてはいけないのですね。なるほど。
 こういう見方をすると二部グラフっぽいので、フローが正しい解法だと納得できそうです。(ACしていません)

2022年5月18日水曜日

yukicoder contest 343

 Aを解いて睡魔に襲われてしまったけど、Bは(厳密な証明はできなくても)見てすぐ分からなくちゃいけない問題でした。


No.1935 Water Simulation

 周期性がある。

 それを厳密に求めなくてもいずれ周期4になりそうな見た目をしているので、適当な回数シミュレーションすればACできる。
 いつ頃周期4になるか、抑える方法はないのだろうか?

No.1936 Rational Approximation

 ACはしたが、証明はちゃんと追えていない。
 なかなか驚きの結果でした。

 ACするだけなら、実験して性質を見つけるのが一番だと思う。
 ファレイ数列を知っているとACしやすかったらしい。

No.1937 Various Tournament

 解説AC。

 あまり考えずに解説を見たら分割統治と書いてあったのでその方針でAC。
 でもまあやることはDPくらいしかないから、自力でやったとしても方針に困ることはなさそう。

 ただ、実装に苦労し、書いている途中、分割統治でない方が書きやすいのでは? という気持ちになった。実際、bitDPなど解いている人もいるようなので、そういうした方が良かったか。
 なんとかACしたけど、上手く書けなかった。

2022年5月17日火曜日

Codeforces Round #787 (Div. 3)

 Eまで五完。疲れていたため撤退してしまったが、続けていたらFは解けたはず……。


F. Vlad and Unfinished Business

 自力AC。

 まず、x~yの距離は答えに加える。
 そこから外れた点には、その点への距離を往復していかなくてはいけないので、x~yを木の根だとして(実装の際はxを根とすれば良い)木DPすれば求まる。

 実装は少し面倒くさいけど、疲れていても思いつけるべきだったね。

2022年5月16日月曜日

Code Jam Round 2 2022

 Abd の470位で通過。
 Code jamのRound 2を通過すること(通過してTシャツをもらうこと)は一年の大きな目標なので、達成できて嬉しい。

コンテスト後のツイート


 自分の実力だと、BCDのlargeを通すのは困難だったようなので、Abcdを目指すのが正しかったよう。
 で、通過したから良かったけど、本番でcの部分点(各人とキャンディをどうペアにするか全探索でできるはず)を取れなかったのはまずかったと思う。

 今回、Abcdだけで出題されていたら、満点を取れた人はたくさんいたはず(2000人くらいになったかもしれない)。
 しかし、実際の通過ラインはAb早解きなので、B~Dのどこかで、満点を取れるかも? と思って止まり、取れたはずの部分点が取れない問題が残ってしまった、という人が多かったのだと思う。

 そういうのを考えると、「全部の問題を読む」「部分点でも取れるところは取っておく」というのがいかに重要かが分かる。
 部分点の実装はlargeまで解けたときのことを考えると無駄になりそうなんだけど、解のチェックをするのに役立つから無駄にはならないんだよね。

 ついでに、Aの類題(?)のこの問題をACしました。当時難しく(面倒くさく?)感じてやめてしまったけど、今解いてもやっぱり難しかった。(けど、一応自力ACできました)

2022年5月13日金曜日

AtCoder Beginner Contest 250

 Fまで六完でした。

コンテスト後のツイート

G - Stonks

 解説放送を見てAC。

 コンテスト中、フローで解けることは分かっていて(というのは嘘で、最大流で解けると思っていた気がする)、それをなんらかの貪欲に直せるんだろう、と思って考えていた。

 どんな貪欲にできるか? という部分は機械的にやれるものではなく、考えて導くしかなさそう。難しい……。

 なお、コンテスト中のACのいくつかは、ここで既出だったためらしい。

2022年5月12日木曜日

Codeforces Round #790 (Div. 4)

 全完。やっぱり全完できるコンテストは楽しいですね。

コンテスト後のツイート


 などと気楽に書いていたらFがHackされてしまった。

 一ヶ月くらい前に、「PythonのsetでHash衝突させることができる」ということがCodeforcesのブログに投稿されたようで、それを利用したものだった。(ツイッターでtomerunさんに教えてもらいました。ありがとうございます!)

 (このブログにも書いてあるように)C++のunordered_setのハッシュを衝突させる方法の作成方法は以前から知られていたが、それと同じ問題がPythonでも知られた、ということの模様。

 今のところ私は、setなどを使う場合は、randomな自然数xを一つ取り、aの代わりにa+xを使うという方法を考えている。(a^xと違い、これなら順序関係が崩れないため)
 これで大体安全だと思うが、どうだろう。

2022年5月9日月曜日

Codeforces Round #789 (Div. 1)

 BとCの二完で終了。

コンテスト後のツイート

 先にDiv. 2の問題。苦戦してしまったので。

B2. Tokitsukaze and Good 01-String (hard version)

 こういうのは二つずつ考えて、"01"や"10"を"00"か"11"に変えると考えると良い。
 そうすればDPできます。

A. Tokitsukaze and Strange Inequality

 PyPyでも普通にACできます!

 コンテスト中は、二次元累積和を二回やっていたのがまずくて、一回にしたら(PyPy-64なら)MLEにもTLEにもならずに通りました。
 落ち着いて仕様メモリを減らそう、と思ったら気付けたはず。こういうところで焦ってしまうのは良くない。

2022年5月5日木曜日

Codeforces Round #786 (Div. 3)

 Gまで六完。EでHackが多く出たため、意外と順位が良かった。

コンテスト後のツイート

 G、STATUS見たら、WA on test18→二分後にAC、みたいな人が何人かいたから、解法が大きく間違っているわけではないだろうと思ったんだけど、結局思いつけなかった。

2022年5月1日日曜日

Codeforces Round #785 (Div. 2)

 Dまで四完。

コンテスト後のツイート

 Cは「分割数」と気付いたのなら、すぐ二次元DPを書くべきでした。たとえば、アルゴリズムロジックさんの記事を参考にすればすぐ書けたはず。

 E以降は今のところ解かなそう。