2024年4月3日水曜日

April Fools Day Contest 2024

 遅刻参加してABFの三完でした。FでQRコードを思い付けたのは嬉しい。


C. They Have Fooled

 解説AC。
 コンテストに関連するのか? とはちょっと考えたが、問題数とは気付かなかった。

D. Are You a Procrastinator?

 解説AC。
 時間が影響するとは考えなかった。Procrastinatorという単語になじみがあれば思いつけたんだろうか。

G. Mathematician Takeover

 ヒントを見てAC。
 なるほど、確かにコンピューターサイエンスではlogといえば底が2のlogを指しますね。

2024年4月2日火曜日

AtCoder Grand Contest 066

 一問も解けず青に落ちた。

コンテスト後のツイート

A - Adjacent Difference

 解説AC。

・市松模様に分ける
・片方を0, もう片方をd (mod 2*d)にする

 どちらも考えたはずなのに、一次元でも上手くいかない気がして捨ててしまった。上手くいかなかったのは、mod 2*dで良いと明示的に考えられていなかったのと、例で計算するのが下手だったせいか。

 ただ、公式解説の、これで良いという証明は自分には思いつきにくいものだった。これを思い付ける数学的証明能力があれば解けていたかもしれないので、そこを反省しよう。

B - Decreasing Digit Sums

 解説AC。

 5ベキに注目するのは全く考えなかった。N=3となる小さい数として625にはちょっと着目したけどそこから考察を進められなかった。

 単純にその数のNの値を考えるのではなく、二倍していったときに桁和がどう変化するかに着目するのが大事だったのですね。

 答えを直接求める実験をするのではなく、ちょっと一般化したような内容で実験をするというのはしばしば必要となる手法。直接答えを求める実験しかせず何も情報を得られず失敗したことは結構記憶にある。そのあたりが反省点か。

 なお、コンテスト中は、あるSにx*2ベキを文字列として足したものを繋げていってNが大きくなるものを探すような実験をしていた。(これでN=19まで見つけられた)
 この実験コードの2ベキの部分を5ベキに変えたら(理由はよく分かっていないが)N=51のものが見つかった。

2024年3月29日金曜日

第10回 Asprova プログラミングコンテスト(AtCoder Heuristic Contest 023)

 pretest29位。最終27位。


 ツイートをまとめておきます。

第10回 Asprova プログラミングコンテスト(AtCoder Heuristic Contest 023) pretestは29位でした。今のところAHCでの最高順位! システムテストで下がらないことを祈る!

・序盤はあまりやる気が起きませんでした。今週はWTFもあるのでほどほどに……という気持ちでやっていました。

・入口を根とするBFS木を作って、葉から埋める方針を考えていました。葉の方から順に埋めると、その先祖のノードでは何を置いて良いかを判定できるので。Sが小さく、D-Sが大きいものから埋める貪欲で30~31点

・それを、なんとなくDが大きい順にソートし直したら点数が31から39まで跳ね上がってびっくり。突然やる気が湧きました。これを山登りとかで改善すれば40はいきそう、と。

・WTF open一日目で青に落ちて二日目はAHCにあてることを決意。山登りするための高速化と、遷移を書いていました。

・遷移としては、「既においた作物を別の似た作物へ変える」「BFS木の親を別のものへ付け替える」の二つを実装。先祖のノードで使うことにしていた作物は一旦全部削除しなくてはいけない……といったあたりが分からず実装に苦戦。実装できたら40に乗りました。

・実行時間が伸びればそれなりに点数が伸びそう、と最終日にRUSTへ書き換え。Chat-GPTや自分の以前のRUSTの提出を見ながら実装して41まで伸びました。

・さらに、PyPyで試したときはあまり効果がなさそうだったけどRUSTなら、と焼きなましを試してみたら416まで伸びました。今まで、山登り→焼きなましではっきり点数が伸びた経験がなかったのでびっくり。嬉しかった!

・あとは温度調整などをして終了。

2024年3月25日月曜日

AtCoder Regular Contest 175

 二完でまた青に落ちてしまった。

コンテスト後のツイート

C - Jumping Through Intervals

 多少解法ツイートを参考したけど、概ね自力でAC。コンテスト後、一時間以上かかってしまった。難しい。

 LR[i]とLR[i+1]の位置関係を考える。x, y=LR[i],  z, w=LR[i+1]とし、y<wのとき、LR[i+1][1]=max(y, z)として良い。w>yのとき、LR[i][1]=max(w, x)として良い。まずこのように更新しておく。

 この更新で値が決まる箇所がある。i, j(i<j)の値が決まり、その間が決まっていなかったとする。このとき、ANS[i]<ANS[j]ならi+1の値を、ANS[j]<ANS[i]ならj-1の値をLRの値との大小を比較することで決めることができる。

 区間の片方しか決まっていない場合も似たようにやる。一つの値も決まらない場合はずっとある値を取り続けられるということなので、そのような最小値を探す。

D - LIS on Tree 2

 解説AC。

 難しかった。
 f(P)の最大値は分かるが、そこまでの値全てを取るのか? またどうやって構成すれば良いかが難しい。根から構成するのか、子から構成するのか、(Pについて)大きい数字から考えるのか、小さい数字から考えるのか、があり悩ましい。

 結局、根から考え、その頂点により、「自分を含む部分木の大きさ」の分だけ増やせる、と考えるのが正しかった。ただ、この見方もなかなか理解できなかった。

 コンテスト中にこの問題を解けていた気はあまりしないので、Cに行ったのは正しかったか。

2024年3月24日日曜日

Codeforces Round 936 (Div. 2)

 Cまで三完。


D. Birthday Gift

 解説AC。

 全体のxorをXORとすると、区間を分けてxorを取ったときの値もXOR以上になるということに気付かなくてはいけなかった。

 あとは、上の桁から、XORのi bit目が0のときに、0のままにしなくてはいけないか、1にしても良いのかを考えていく。
 0にするときは、A_l^...^A_rのi bit目が0になったとき、その部分をA_l^...^A_rに置き換える……という貪欲を行って良いと気付くと実装しやすい。

 分かってしまえば難しくはないのだが……。

2024年3月21日木曜日

Codeforces Round 935 (Div. 3)

 Eまで五完。


F. Kirill and Mushrooms

 コンテスト中は取得するマッシュルームのindexが連続してなきゃダメと誤読して解法が分からず。コンテスト後、さらにPの意味も誤読し(P_iが小さい順番に0になると思った)ていたことが発覚。
 正しく読めた後も無駄にifをwhileと書いていた場所が悪さしてWAを重ねてしまった。

 解法は、(i,A[P[i]])を第二要素が大きい順に見ていき、heapqに突っ込み、今考えている長さよりiが小さければその要素を捨てていく……といった感じ。


yukicoder contest 422 (第1回 競技プログラミング講習会作問企画コンテスト)

 Dまで四完。


No.2683 Two Sheets

 自力AC。

 縦と横を独立に考えられると思ったが、コンテスト中は、そのまま(縦の期待値)*(横の期待値)になる気がし、答えが合わず混乱。
 落ち着いて見ると、重なっている部分が長方形になるので、そこを縦*横で計算できると気付いた。

 これがすんなり解けないのは、やっぱり確率/期待値が苦手なのかなぁ。

No.2684 折々の色

 自力AC。

 難しくはないけど、同じカードを二枚重ねる場合などに注意が必要ですね。

No.2685 Cell Proliferation (Easy)

 自力AC。
 これは簡単でした。シンプルな二乗のDPでOK。

No.2686 商品券の使い道

 解説AC。

 高速ゼータ変換について何も覚えていなかった。
 部分集合に関してのDPを考えれば結構自然な考え方に見えた。
 高速ゼータ変換は(他次元)立方体における累積和を考えている、というのも覚えておきたい。それが身に着いていれば、高速ゼータ変換を忘れたとしても、どんなDPを考えれば良いか? と思考すれば思いつけるはず。