/ 最近 .rdf 追記 編集 設定 本棚

脳log[20251213]



2025年12月13日 (土) [AtCoder] 今日は AtCoder Beginner Contest 436 があった。F 問題までについての話だけど、あまりにも淡泊な問題ばかりで、新入生歓迎シーズンかなと今が何月か考えてしまった。年末でした。■A 問題 o-padding。数を1つも間違えずに計算できる自信がないので、十分な長さの文字列からちょうど長さ N の文字列を切り出しました。■B 問題 Magic Square。何を言っているのかさっぱりわからない。何をさせられているのかわからないまま機械的に翻訳しました。とまどっていた時間を含めて所要時間5分。■C 問題 2x2 Placing。配列にメモをすると空間的にまずいので Hash 表に記録をする。■D 問題 Teleport Maze。F までで一番時間を使った (18 分)。考える要素はない。BFS をする。何度もワープをしないように対策をする。ノータイムでそれがわかるのに時間がかかるんですねえ。一番手間取ったのは、キューには迷路での位置を表す添字を入れたのだけど、添字とワープを表す英小文字を混同してうまくワープできていなかったことをつきとめるのにえらく時間がかかった。つまり、添字から文字を参照し、文字からワープ先を参照する必要があったのだけど、添字からワープ先を参照しようとしていたということ。自分は普段訪問済み情報にグリッドの情報を予め埋め込んで、ループの中ではグリッドを参照しないでもいいように心がけているのだけど、無理だったと。無理だということが直視できていなかったと。普段の心がけから起こるべくして起きたミス。 あと同じくらい時間がかかったのが、ゴールマスの添字がいくつになるかということ。何度もサンプルのグリッドのマス目を実際に数えて、それが H×W のグリッドだといくつになるかを考えたのだけど、何度数えて何度計算しても1ずれてたの! ちなみに迷路は各行の末尾に番兵を置いたうえで1次元化していた。なんで1ずれたかというと、ゴールのある最終行の番兵の位置まで添字を1マス1マス数えていたからですね (最終行に限って番兵を数えてはいけない。それはゴールの次のマスだ)。やはり A 問題で対策したように計算しない方策を選ぶべきだった。■F 問題 Starry Landscape Photo。E 問題と 25 点しか違わないので、E と F 両方解けるにしても両方解けないにしても F 問題からとりかかって損がない。往年の F 問題って感じ。つまり、後ろに2問控えていた頃の? 「あなたは BIT (あるいはセグメント木) を知っていますか」。知っています。まず、何番目に明るい星まで写すのかを決める。今決めた星は必ず写す。この区別によって同じ構成の被写体を複数回カウントすることを防ぐ。あとは、左右にあるそれより明るい星をいくつずつフレームに収めるのかを決める。その通り数。計算式が二転三転したことにもう驚きはない。数字とは友達になれない。左に L 個、右に R 個の明るい星があるときに、中央にある1つだけを写す場合を含めて 1+L×R 通りではないんですよ。(L+1)×(R+1)-1 通りでもないんですよ。テキトーやってんじゃねーんですよ。答えは 1+L+R+L×R でした。わけるわけなくない? 頭を使ってどうぞ。■E 問題 Minimum Swap。ちょっとひねった問題設定でした。「1 回目の操作としてあり得る操作の数を求めてください」。要するに、答えに近づく1手であれば何でも良い。無駄な操作でなければ何でも良い。無駄でない操作とは何か。第一感は「交換した結果少なくとも一方が正しい位置に納まる操作」だった。嘘くさいなー。N=3、N=4 で嘘を暴こうとシミュレートしていて思い出したのが、すべての並べ替えは平行して存在する単数または複数の玉突き位置交換ループの足し算だということ。ということは数列を漏れなく玉突きグループに分けたときそれぞれの大きさがわかれば、グループ内で位置を正す操作の選び方は、2個を選ぶ組み合わせの数……だと思って AC だったんだけど、今になってわかっていなかったことがわかってきている。グループ内でどの2個を選んで位置を交換しても必ず正しい位置に近づいてるんですか? わかりません。こうである必要がある、を答えにしてたまたま AC だったけども、それだけで良かったのかどうかは考えていなかった。■F 問題。提出前に 1+L+R+L×R の式を見て一度だけ因数分解を考えて捨てていたのだけど、他の人の提出を見て (L+1)×(R+1) で表せることに気がついてしまったね。第2案で無駄に -1 をして答えを間違えていたことも、因数分解をしようとして失敗していたことも、とにかく中学生レベルの数学ができないことが露呈している。コンコンコン……入ってますか?(入ってません)■F 問題。通り数の計算式以外にもバグらせていた。処理の昇順と降順が反対だった。原因はたぶんだけど、明るさの表現として「1番明るい」と「明るさが N (最大)」の2通りを混同して区別なく使用していたのだろう。■自分のすべての提出。平均すると1問あたり8分で解いてるんだけど、その短時間でこんなにもバグがてんこもりなことに我がことながらあきれます。■■■E 問題みたいな並べ替えについては過去に散々苦しんだ経験がある。第二回全国統一プログラミング王決定戦予選-C「Swaps」(20191111p0120200826p01)から始まって ARC120-C「Swaps 2」(20211022p01)、ARC124-D「Yet Another Sorting Problem」(20211125)。Swaps 2 だけ毛色が違うけど他の2問は E 問題に繋がる問題だった。そこで散々数列をこねくり回した経験からひとつの見かたを獲得した。過去の日記でも触れてるけど、「競プロerのための群論 (swapと順列と対称群) - little star's memory」のようなありがたい記事を読んでも全然理解できないし身にもつかないのです。