週記(2025/11/10-2025/11/16)

11/10(月)

午後3時起床。少しだけインターンで稼働して、そのまま定例会に出席した。

勉強会はOCRの各種モデルのサーベイ。画像を投げたら一発で文章が返ってくるようなend-to-end方式だと、誤字などは勝手に修正されてしまうようだ。誤字だけならよいが、一般的でない語彙や記号の羅列も同様に、正確には読み取られない。そういうもので精度を出したければ特化した学習を行う必要がある。

解散後に学食に行って夕食を摂り、そのあとはずっと先週の週記を書いていた。コンテストがいくつか穴あきのまま投稿。

Yandex Cup Algorithm部門の決勝進出メールが来た。YouTubeにアップロードしたQualificationの録画は、不正をしていないことの証明として無事機能してくれたらしい。URLを送ってから数日、再生回数が全然動かなかったので心配していたが、今日見ると11回となっていた。運営の確認作業の進捗状況が伺える。

日付が変わり、普段より30分遅い午前0時5分からCF #1063 div.2。

Dashboard - Codeforces Round 1063 (Div. 2) - Codeforces

書く

www.youtube.com

さて、Yandex Cup決勝への招待を受けるためには参加フォームを埋めて提出する必要があり、そのためにはフライト日程を決める必要がある。Qualification直後に決勝進出見込みの日本人が集まるDiscordサーバーが立てられており、そこでCFの間にも議論が交わされていた。

決勝が行われるトルコ・イスタンブールへは日本からの直行便がいくつかある。特にTurkish Airlinesは羽田と成田(と関空)との間に毎日一往復ずつ飛ばしているため、行きも帰りも直行便を使うことは可能。しかしどうも、時間帯の利便性があまりよくないようだ。特に行きは朝早く出るか、朝早く着くかの二択になってしまう。

羽田空港を午後10時に出る便は、出発時刻の都合はよいが、向こうに到着するのが午前6時前。ホテルにチェックインできるまで半日ほど空くのはなかなか辛い。観光で出歩く元気が残っている自信もない。

そこでホテルを一泊追加する選択肢が登場するわけだが、するともう一本早めたほうが向こうを満喫できるだろう。そちらは到着時刻の都合はよくても成田空港を午前10時に出ることになって、日本でさらにもう一泊前泊する必要が生じる。

せっかくの海外旅行なので後者を選ぶことにし、早速成田空港近くの東横インを予約した。日本人参加者が全員揃って行動するわけではないものの、同じ便を選ぶ人が複数名いる様子だったのは安心。

Excursionをフルに楽しもうとすれば帰りについてはほぼ一択で、深夜に向こうを出て午後8時に羽田空港に到着する便を選択。入国手続きなどで時間を取られた場合、新幹線の終電に間に合わない可能性があるので、注意が必要。

フライトを決めたところで就寝。午前6時だった。

11/11(火)

午後1時起床。数値計算の手法を改善し、コードを回すのを繰り返しながら夜まで小刻みに二度寝していた。

1時間ほど寝てから進行状況を確認したら、非常に重たい処理を終えた後に変数名のミスでエラーを吐いていたことがあって、膝から崩れ落ちた。処理を関数にまとめていたため、途中の計算結果を取り出すこともできず、数文字修正してまた実行することになった。

午前1時過ぎ、ラノベ「才女のお世話」11巻を読了。非常に面白かった。前巻でついに生徒会役員となった主人公をヒロインの父親が認め、これまでひた隠しにされていた家庭の事情がほんの少し明かされた。一方でヒロインの外向けの演技にも変化が現れ、さらに文化祭に主人公の以前の同級生がやってくることになり……と、あまりスポットライトの当たっていなかった要素が今後取り扱われる様子。これからのストーリーに大きな期待を持たせる巻だった。

ただ一点、ヒロインの父親の名前であるべきところが数か所、兄の名前になっていたのが気になった。誤植だが、プロット時点では家庭の事情を導入する役割は兄が担っていたのかもしれない。

しばらくなろうを読んで午前4時過ぎ就寝。

11/12(水)

この日は寝たり起きたりしながらずっとなろうを読んでいた。午前10時半起床、午後0時半から午後4時まで二度寝、午後10時就寝。

合間に数値計算の様子を見ると、どうもメモリ使用量が多い。プログラムを確認したらmallocで確保した領域をfreeしていなかった。競技プログラミングだとこの辺何もしなくても動いてくれる、というかそもそもmallocを使うことがないので取り扱いに疎い。さらに巨大な行列がどれだけメモリを消費するかの見積もりもできず、メモリリークに気付くのが遅れた。

結局これは、アルゴリズムの改善によってそもそも一時メモリを確保しないようなコードとなった。

11/13(木)

午前1時起床。

午前中は数値計算のプログラムを書いていた。Geminiに定理の名前だけ伝えて実装させると、自分の知らない公式を使ったコードを出力してくれたのだが、実行してみるとまるで見当違いの値が出てくる。公式の根拠について問いただしても要領を得ず、ググっても何もヒットしなかったので、結局自分の知っているアルゴリズムで書き直すことになった。

昼過ぎに登校。学食で昼食を摂り、午後1時半からセミナーを行った。ここ数日の数値計算についての進捗報告程度で、1時間ちょっとで終了。

学部時代の同期三人が集まり、その場にあったUNOをプレイした。できるだけ本家ルールに近づけようということで、同梱の説明書を見つつ十戦。毎回一人が上がるたびに残った手札を点数に換算し、足したり引いたりして総得点で勝敗を付ける。本来は誰かが500点に達するまで続けるらしいが、時間の余裕がなかった。

自分が慣れ親しんだルールと本家ルールの大きな違いは、勝敗の付け方以外だと「カードは一枚ずつしか出せない」「ドロー系のカードは重ねて出せず、回避ができない」「記号カードで上がってもよい」の三点だろうか。どれもゲームの戦略性を上げるようなものだと感じた。逆に、これらのルールを取り払うと大量のカードが乱舞する盛り上がったゲームになる。

しかし三人プレイだと誰かの上がりを阻止するのが非常に難しかった。ドロー4とほか一枚を残した状態からだと、ドロー4を出してもう一枚の色を指定することでその色が自分に回ってくるため、ほぼ確実に上がることができる。相手に四枚引かせた直後に上がるので得点も稼げる。最後のほうは全員これを狙うゲームと化してしまった。

学食で夕食を摂ったあと、院生室に置いてあった「闇金ウシジマくん」のサラリーマンくん編を読んだ。人が借金漬けになっていく様子は見ていて苦しい。周りの人を巻き込む様子も恐ろしかった。自分だけ危うきに近寄らずを心掛けていても、知人のトラブルに巻き込まれることは回避できないし、そうなったら創作のようにうまく始末を付けられるわけでもないのだろう。

午後9時20分からyukicoderのコンテストに出た。今日は東京科学大学のサークル「traP」が開催した作問ハッカソンのセット。来週Day2もあるらしい。

yukicoder contest 作問ハッカソンコンテスト 003 Day1 - yukicoder

書く

出張から帰ってきた足で深夜に登校してきた後輩からお土産をもらった。京都観光をしたいというので、自分の行ったことのあるスポットから「京都タワー」「二条城」「鴨川デルタ」を伝えていたのだが、律義にすべて巡ってきてくれたらしい。感激した。

午前2時帰宅。夜中の山道は熊が出没するかもしれず、非常に怖かった。少し前にゲーセンからの帰り道を怖い怖いと言っていたが、交通量も明かりの量も、今日通った道のほうが断然少ない。

Yandex Cupのホテル情報が公開されたため、前泊するホテルを探した。本来は同じところに泊まるつもりだったが、思ったより高価で、誰かと相部屋にしたとしても手を出すのは躊躇われる。例年Excursionの日の夜まで部屋が確保されていたところ、今年は一泊分短くなっていたのも、宿泊費の問題かもしれない。

徒歩圏内には他のホテルがないようなので、タクシー移動をすることになる。この場合選択肢が無数にあって、この日は決めきれなかった。午前5時半就寝。

11/14(金)

午後2時起床。

ハーメルンで「変な女子に目をつけられてしまった哀れな男」を読んだ。よう実の二次創作で、今のところ勘違いものをしているように見える。自覚のない状態ではやっていけないような舞台設定だと思っていたが、今後どうなるだろうか。まだ話数が少ないので、オリ主の具体的な能力も明らかになっていない。

syosetu.org

二度寝して午後7時起床。

小林賢太郎さんが脚本・演出を手掛けるコント公演「イミノウム」が仙台でも上演される。残念ながらAtCoder Japan Openの前後泊と丸被りで行くことはできないが、これに関する動画が上がっていたので見た。

途中で仙台駅のアンパンマン像が「石にされてしまったアンパンマン」と紹介されていて驚いた。自分も似た名称で呼んでいるが、特に出典などはないので、自然発生的に同じワードが出てきたことになる。

www.youtube.com

数値計算のコードの高速化を行った。C言語での行列計算はすでにいろいろ手を加えてあるため、今回はSageMathで計算している部分を弄った。多項式での計算をできるだけ避けるとか、行列の定数倍や足し算を一回でも削るとか、ゼロベクトルの判定を用意されているis_zeroメソッドで行うとかの工夫で、すぐ三倍速から四倍速になり唖然。特に一つ目が効いた。

少しラノベを読み、午後11時半からECR184に出た。

https://codeforces.com/contest/2169

書く

www.youtube.com

ラノベ「最強の吸血鬼は普通に生きたい」2巻を読了。面白かった。主人公のスキルや弱点を知り尽くした敵が出てくるとあらすじにあったが、単体ではそこまで脅威ではなく、日常を守りながら撃退するのに苦労するという構造でピンチを演出していた。タッグで登場した敵の片方は主人公の使い魔が圧倒してくれてスカッとした。一方もう片方は主人公自身が対峙し、奥の手を使ってようやく倒していたので、タッグを組むには強さにギャップがありすぎるようにも見える。

午前8時就寝。

11/15(土)

午後1時45分起床。午後2時からUniversal Cup 5回目、Grand Prix of Nanjingを走った。

https://qoj.ac/contest/2581

書く

午後9時からはABC432。

OMRON Corporation Programming Contest 2025 #2 (AtCoder Beginner Contest 432) - AtCoder

書く

www.youtube.com

午前3時からのMHC R2に向けて仮眠を取るつもりだったが、食事やシャワーをダラダラ行っていたらそんな余裕もなくなった。

Meta Hacker Cup - 2025 - Round 2

AはM\le N\le 2M-2ならM点先取で、2M\le NかつNが偶数なら二点差をつけて終了する。

Bは二分探索すると、各参加者に渡すグッズの個数が確定した状態で判定問題を解けばよいということになる。肝心の判定は典型問題で、残念ながら解法そのものは頭から抜けていたが、最近のABCで出題されたことは覚えていた。ABC424Gである。

G - Set list

Cは適切にBFSをする。路線ごとに各コートは高々一回ずつしか見なくてよいため、まだ見ていないコートをsetで管理した。遷移時はlower_boundとインクリメントでK離れたコートまでを舐め、その都度setから削除していく。

Dは累積和\bmod Kに出現した値の集合を持って桁dpするとO(2^K K\sigma|R|)で、現在の累積和との差を管理するとKが落ちるが焼け石に水。冷静になるとK桁以上の数は鳩ノ巣原理から必ずK-weakになるため、|R|=O(K)としてよいものの、これでもまだ全然間に合わない。

ここで、集合のサイズを見ればどの桁を計算しているのかわかることに気づいた。popcount一定の数を全列挙するテクでO(2^K\sigma)。実験すると最悪ケースばかりでも間に合いそうだったので、提出を試みた。テストケース数の制約がサイレントで75から80になっていたり、しっかりK=25のケースばかり用意されていたりしたが、なんとか4分ちょっとで実行が終わった。

EはAの累積和Sを取り、重みiで価値S_iの品物があるナップザック問題を解く。最大効率のものに適宜組み替えることを考えれば、それ以外はdpで計算できる範囲に収まるので、最後に算数すればよい。

組み換えの議論では、最大効率以外のものはそれぞれN個未満しか使わないということしか確認しなかった。すると重みの和がN^3になるのに、N^2だと思い込んで実装。このミスにはコンテスト後に気づいたが、実は正当で、証明はD問題と同様鳩ノ巣原理によって行えるらしい。証明にも結論にも見覚えがあるのに、いざとなると頭から出てこない。

2時間弱で全完し、9位だったのが結果が出たら7位に上がっていた。結構ポロポロ落ちていて怖い。

順位表を見るとCまで3完のインド人が大量にいる。特に3完最速のあたりの密度は凄まじいもので、これはもう真っ黒だろう。今のところ500位ボーダーは3時間でCまで3完だが、ここからどれだけBANされるか。実際、コンテストが終了してしばらくしてもR3進出決定の文字は出ていない。

午前7時半就寝。

11/16(日)

午前10時過ぎ起床。

CFで行われた台湾のICPC地区大会のミラーにソロで参加した。ICPCルールに準拠してコピペなし。検索はライブラリの窃盗に限りアリにしていたが、結局その機会もなかった。

https://codeforces.com/contest/2172

書く

www.youtube.com

3時間ちょっと仮眠。後からすぐ使うから、と思って手元を照らすデスクライトを付けっぱなしにしたら、枕元まで強い光が届いており、部屋の電気を付けたまま寝るのとはレベルの違う光度であんまり寝た気がしなかった。

AtCoder Regular Contest 210 - AtCoder

書く

www.youtube.com

午後11時半からCF #1064 div.1。

https://codeforces.com/contest/2165

書く

www.youtube.com

明日まで開催されているAHC056に少しだけ取り組んだ。順位表では百人以上の人が全く同じスコアで並んでおり、そこそこ強い貪欲解があることが見て取れる。問題を読んでから考えていた、マスの座標を色と、内部状態を目的地と対応させる方針を実装してみた。

最初の提出が18359点、そこから規則が被らないよう適当に色を圧縮してみるとCがかなり減って8947点。生のスコアを言っても分かりづらいが、どうも貪欲解の倍くらいかかっているらしい。新たな方針も思いつかず、そのまま投げ出した。

この日記を書いている時点でコンテストは終了しており、貪欲解の方針も公開された。最短経路を一つ取り、すべての移動に対してユニークなペア(c,q)を割り当てているらしい。経路長をXとしてC=Q=\sqrt Xが達成される。

まず、そのような構成が可能であることを納得するのに少しかかった。またこれが大幅な改善になることも驚き。しかし考えてみると、目的地から目的地への距離はおよそO(N)なのでX=O(N^3)と評価でき、Q=K=O(N^2)が確定するより良くなるのは当たり前だった。

グリッド上の最短経路は上下左右をどの順で探索するかなどによって無数のバリエーションを持つから、貪欲解は経路の選択に依存しないだろうとは考えていたが、言われるまで全然わからないものだ。

HACK TO THE FUTURE 2026 (AtCoder Heuristic Contest 056) - AtCoder

日記を書いて午前11時就寝。来週は集中講義の週。