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を考えれば良いか? と思考すれば思いつけるはず。

2024年3月20日水曜日

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

 Eが解けずABCDFの五完。

コンテスト後のツイート


E - Colorful Subsequence

 解法ツイートを見てAC。

 色の異なる価値の高い二つを持つ(TOP2を持つ)のは典型だし、他の問題では自力で思いついたこともあった気がするのに、この問題では浮かばなかった。
 DPの枠組みの中でやらなくてはいけないから気付きにくいのかな……。

 Fより難しい気がしたけど、解法を見ればEも典型で、Fより前に置いた気持ちも分かります。

 なお、雑にsortを使って書いたらPyPyだとTLE、書き直したら微妙に間違えてWAをなくすのに苦労した。計算時間ギリギリそうなんだから、sortなんて使ったらそりゃダメですね。




2024年3月18日月曜日

Codeforces Round 934 (Div. 1)

 問題は解いていたのだけど、提出せず。
 コンテスト後提出したら、A:WA、B:AC、D1:TLE(ちょっと修正してAC)でした。

コンテスト後のツイート


A. MEX Game 1

 自力AC。落ち着いたらすぐACできたが、本番提出してWAが出た後だったらどうだったか。

 C=Counter(A)として、
・C[i]=1となる最も小さいiについて、C[i]=2とする
・C[i]<=1となる一番小さいiが答え。

 相手がスタートだとすると、相手が取ったものを自分が取る真似っこ戦略が使える。
 最初に自分が一手おけるので、C[i]=1のものを、真似っこできるように+1すれば良い。