週記(2022/11/14-2022/11/20)

工事中

11/14(月)

午後4時過ぎに起床。起きたら生協に行こうと思っていたが、そんな余裕のある時間には起きられなかった。

隙間時間に年末調整を終わらせた。先週金曜日、もとい土曜日朝方に送った質問にはまだ返信が来ていなかったので、待つのを諦めてそれっぽく書いておいた。そもそも自分の判断が合っているか確認する程度だったので、何かミスが発生するとは思っていない。発生しても死にはしない。

年末調整にチャレンジした。期限は11/14つまり来週の月曜日である。少し書類作成が進んだところで、インターンの給料の扱いに関して疑問が生じた。担当の方に質問を送ったが返信は月曜日になるだろう。

週記(2022/11/07-2022/11/13) - kotatsugameの日記

午後4時半からインターン先定例会。先週火曜日にちょっとコーディングしたが思ったより難しかったのであまり進んでいません、と報告。進行スケジュールもちょっと後ろ倒しになった。タスクの中にも終わらせないと使えないものとそうでもないものが混じっていると認識していて、ちゃんと前者を優先的に片付けるべきかもしれない。

勉強会はアルゴリズムパズルの話で、不変量を見つけて解く問題がいくつか紹介された。この発表は僕がインターンとして入社した最初の勉強会の続編みたいなもの。そのときと同じ問題が二つほどまた扱われたのでびっくりしたが、よく考えてみれば前回の発表以降に入社された方も多いのか。当時は順に指名されて意見を述べるという形式だったのに対し、今回は指名を待たず活発に議論が行われて、非常に活気があった。

再登場となった問題の一つについて、ほぼ同じものが発表から一月後くらいのARCで出題されたことにも言及された。懐かしい。

今日はパズル系の発表で、ミーティングに参加している人々と共に頭を働かせた。

週記(2021/09/06-2021/09/12) - kotatsugameの日記

Bはつい最近インターン先の勉強会でほぼ同じ問題が扱われており、難なく解けた。

週記(2021/10/11-2021/10/17) - kotatsugameの日記

勉強会を終えた後、午後8時前に完成させた先週分の週記を投稿した。2時間ほどTLを眺めたりYouTubeを眺めたりして時間をドブに捨て、そこからセミナーの準備。

途中机に突っ伏して寝てしまったりもしつつ、午前3時半に終了した。証明が長くて大変と思っていたが図が多いだけで実際はそうでもなく、終わってみれば準備したメモ書きは普段とほぼ同じ量になった。ただ証明の手順をどこから思いついたのかがかなり謎。気持ちがうまく汲み取れなくて感覚的な説明が思いつかなかった。その分丁寧に論理を追う必要があって、発表には少し時間がかかりそう。

シャワーを浴びて1時間ほど日記を書き、午前5時過ぎ就寝。

11/15(火)

午前9時半起床。準備して出発。

今日はかなり空腹で、多少遅刻してでも朝ごはんを確保したい。山の上の駐輪場に到着した時点で午前10時を回っていたため山の上の購買が開店しており、無事購入できた。実はこの直前に川内キャンパスの購買にも寄っていたのだが、そちらはギリギリ開店前だった。時間ロス。

ちょっと遅れてセミナーの教室に到着。普段は同級生の発表を先に行うところ、今日は発表する内容がないらしくすぐ自分の番になった。前回木曜日からそれほど日を置いていないのでそういうこともあるかという感じ。確かに自分もなかなか慌ただしいセミナー準備だった。

今日は命題を三つ示す。最後のものの証明に入り、自明なケースをいくつか処理したところで少し早めの昼休憩にしてもらった。ここからは一息でやりたい。購買で買ったパンやおにぎりを食べ、午後0時半から再開。そこからは30分ほどで終わった。思ったよりスムーズに進んだ。用意した図を見せるのではなく、自分で色チョークを使い描きながら説明できるのがやりやすい。わかりやすくもあることを願う。

次に博士課程の方のセミナー。最終的にはなんと6時間もやっていた。最初4時間は普通に進んだが、そこで出てきた命題が見た目より非自明で、残り2時間は全員が思い思いに証明に取り組んでいた。2重の極限で表現される値と1重の値の一致を示す必要があって、それっぽい議論はできても精密にやるのが難しい。イプシロンデルタでそういう2重になった値を扱ったことがなく、どうやるのかよくわからないしやる気にも慣れない。

途中でTAをしている講義の学生が質問に来られて、先生と一緒に対応していた。この講義は、今は先生が用意したPDF資料を使い持ち回りでセミナー発表を行っているが、もうそろそろ終わりそう。次も持ち回りで発表を行う予定で、今度は内容をある程度自由にしてよい。何をするかに関しての質問だった。あんまり実のあることは言えなかった。

次回のセミナーについて少し打ち合わせし、午後7時半に解散。いったん帰宅してまたすぐ外出した。ゲーセンに行く。

まず立ち食いそば屋で腹ごしらえ。これまで330円だったかけそばが350円に値上げされていた。もっと前は300円だった気がする。1年ほど前に比べれば最近は客足も戻ったように見えていたのだが。世知辛い話だ。

今日は新曲を埋めるので手一杯。一応の成果として、14+で新規のAJとSSS+を一つずつ出した。あとは15で最近プレイしていないものを適当に。結構ポンポン伸びるがSSSには遠く、あんまりやる気が出ない。

何気なく選曲したら一発で出た。ちょっと赤が多かったのが残念だが、中盤の階段……というより微ズレ配置で出さなかったのは偉い。直前のタップで焦るのでちょっと苦手。ラストの鍵盤はこれまで苦労していたのが何だったのかと思うくらい綺麗に通った。

焦らず押せるようになっていていい感じ。押すのが間に合うから焦らなくなったのか、焦らなくなったから脱力できて押すのが間に合うのか。意識的には後者である。といってもこのミスは変なところにある1/1タップで、直後のスライダー全体を押さえさせる配置に意識が向いて焦った結果なのだが。前半にも同じ配置があって、そこもギリギリで耐えていた。

今、チュウニズムはグッズプレゼントキャンペーンをやっている。ゲームで使えるキャラクターを引き換えるのに30クレ分のポイントが必要で、前回は4キャラクター一気に引き換えることができたが、今回は期間ごとに1キャラクターずつ引き換え可能となる。特に今のキャラは11/23まで。今日で必要ポイントが半分貯まったと思って確認したところ、1ポイントも貯まっていなかった。

なんとスーパーノバはキャンペーンに参加していない店舗だった。前回も同様の罠に引っかかって、その時は開店してすぐだから仕方ないかと思っていたが、それは特に関係なかったらしい。がっくり。あと1週間で30回プレイしなければならない。

直近2回スーパーノバに行った分のポイントがないことに気づいた。どうやら開店からキャンペーン終了まであまり間がないこともあって、キャンペーンの参加店舗となっていなかったらしい。

週記(2022/04/04-2022/04/10) - kotatsugameの日記

ラーメンを食べて帰宅。天気予報を朝に確認したきりで、雨が降る中自転車を漕ぐ羽目になった。一応折り畳み傘は用意していたが、自転車を置いて帰るほど強い雨ではなかった。

しばらくTLを見たりYouTubeを見たりした後、午前2時から日記を書き始めた。しかし眠気が非常に強かったため、1時間で切り上げて布団へ。横になってスマホを触っていたら寝落ちした。

11/16(水)

午前9時前に一瞬起きた。午後から1on1があるので、それに合わせて目覚ましをかけて二度寝

午後1時起床。しばらくコーディングして午後2時から1on1に臨んだ。1時間弱で進んだ量など大したことがないので、それを説明した後はペアプログラミングのような感じで進行。その場で確認を取りつつ必要な機能を実装していった結果、先週の時点でのToDoリストを全部消化できてしまった。代わりに1on1は3時間半もの間続いた。それだけお付き合いしていただいて本当にありがたい。

今のところもう新たに実装するべきこともないようなので、出力を眺めて正しく動いているかチェックするのが来週までのタスクになった。1on1を終えてすぐ外出。今日こそキャンペーンのポイントが貯まるゲーセンに行く。

まず食事。麺類ばかり食べているとまずい気がしたので、いつも行くような店を避けながら商店街を練り歩き、ステーキハウスなる店に入った。いい値段のする肉がメインだが、定食くらいなら自分でも手を出せる。

GiGO仙台で閉店まで22クレ遊んだ。今日は主に14の未AJを埋めていて、新規に6譜面出せたため残り6譜面。特に赤の14は全部AJすることができた。さらに14+のAJ、15のSSSを一つずつ出した。

ラストの高速トリルは脱力を意識すると間に合った。かなり良い精度で揃ってうれしい、というよりここまでくるとあと1個減らしたかったという思いが強い。中盤気を抜いていたらしょうもない赤をいくつか出してしまった。その後ここまで綺麗に通るとは思っていなかったのだ。

久しぶりにプレイしてみたら序盤が上手で一気に7kまで伸びたため詰めた。追加4回で上のリザルトに。そろそろ出そうだし手元でも撮ろうかな、などと考えていたらうっかり手を離してしまったのだ。その後スマホアームをセットし、再度のSSSを狙ってみた。

すぐ序盤に癖がついてダメになってしまったが、たまに8k以上残して通るので、そこから後半を耐えるゲーム。鍵盤も譜面をよく見ることを意識したら通行料がそれなりに安くなった。閉店直前に8kにギリギリ届かないスコアの手元が撮れた。しょうもないところでミスを出したので悔しさが残る。動画で見ると序盤の手元の汚さが際立つ。これは本当に押せているのか?

ゲーセンから出た後マックで食事した。紙ストローを初めて使ったが飲みにくいし口当たりも悪くて、SNSで不評ばかりなのも納得。

帰宅して日記を書いていた。最近はてなブログの編集画面で文字を範囲選択したら固まることがあって、いつもページを開きなおす羽目になっている。今日は勝手に取られるはずのバックアップからの復元もできず、1時間くらいかけて書いた文章が消えてしまってショック。ただこの1時間は何をどう書くか悩むことが多くて量はさほどでもなかったから、記憶からの復元がしやすかった。

午前5時前に布団に移動してラノベを開き、1冊読了。「メイジアン・カンパニー」。

魔法科高校の劣等生」シリーズの続編である。本編が完結した高校の卒業式から時間が飛んで2年後、主人公世代が大学3年生になった時系列で開始した。あとがきによれば本編最終巻のエピローグも同じくらいの時間だったらしいが何も覚えていない。そもそもストーリーも怪しかったので、冒頭で高校3年間における主人公の軌跡がざっと概観されていたのには助かった。司波達也の実力は隠されている、というイメージが強く、本編ラストでは思ったより広く知れ渡っていたということを改めて知ってびっくりした。

内容は面白かった。主人公の出番が多くて嬉しい。ちょくちょく魔法大学でのシーンが挟まれるのはかなり好みだった。直接的に戦っていたのが新キャラだけなのは、主人公が強くなりすぎた弊害といったところか。それでも最後はきっちり締めてくれて満足感があった。

もう1冊開いてそれなりに読み進めたところで就寝。午前10時過ぎだった。

11/17(木)

午後3時半起床。ありえないくらい眠くて、TAから帰ってきたら仮眠しようと決意した。必死に布団から這い出て大学へ。生協で予約していたラノベを受け取った。

TA。最近発表資料が共有されない回が続いていて、今日も何も知らない状態で話を聞くことになった。黒板発表なので特に資料は用意していないとのことだが、原稿だけであってもそれをアップロードしてほしい。しかし人に見せるのを想定していないであろうものを引きずり出すのも申し訳ない。

こういうことを先生に伝えたら、板書の写真を撮って後でアップロードすることになった。写真は発表者が撮る予定だったが、忘れている様子だったので自分が撮っていた。このくらいは最初から担当するべきだった。

発表はなかなか堂々としたものでよかった。立体の図はかなり綺麗。文字は綺麗という表現には当てはまらないものの読みにくいわけでもなく、行が揃っているので印象が良い。ちょっと小さいかなとは思ったが指摘するほどでもなかった。

内容は元のpdfの担当部分と、追加で群の導入。途中で僕や先生がいろいろ口出ししたり質問したりと、そればかり記憶に残ってしまった。次回やるはずの部分に踏み込んだ議論もしていて、自分ばかり満足しているようでちょっと申し訳ない。

また群の例として二面体群D_3を挙げていたが、参考にした教科書が間違っていたらしい。三角形を3次元空間において変換を線形写像で記述するとき、変換後の(x,y,z)がどんな値か考えなければならないところで、x,y,z座標がそれぞれどこに行くかという置換の記法とごっちゃになったのか、結果として回転が逆向きになっていた。つまり、本来(x,y,z)\mapsto(z,x,y)となるべきところが(x,y,z)\mapsto(y,z,x)になっていたのだ。指摘したがうまく飲み込めないようで少し詰まっていた。こんがらがる気持ちもわかる。

そうやってちょくちょく発表を止めていたら時間をオーバーしてしまった。講義終了時刻から15分経過したところで先生がD_3の乗積表を書かせようとしたので、それはさすがに止めた。講義後少し話して解散。

学食で夕食を摂り午後7時帰宅。起き抜けは絶対仮眠するぞという気持ちだったが、今は少し元気な気がするのでこのまま夜中のTCOまで起きていることにした。そもそも寝起きで出るようなコンテストでもない。しばらくYouTubeを見た後、さすがに何か精進しないとと思って昨年のSemifinalの問題を解こうとした。

Appletが起動せず、焦る。再ダウンロードしたら直った。以下のリンク先の「CLICK TO DOWNLOAD」を押すのが正解。その少し上にある「download and install」を踏むとそれっぽいブログ記事に飛ぶが、ここにあるリンクは生きていなかった。

Competitive Programming at Topcoder | Topcoder

先週もダウンロードし直していて、以下のようにファイル名が変わったのを不審に思っていた。今日ダウンロードしたものは元に戻っている。TopcoderのDiscordによればこの短い間にまたアップデートがあったらしいので、そのせいだろう。

Appletをもう一度ダウンロードしてみたところ、なぜか動いた。ファイル名がこれまで使っていたものと異なっている。

週記(2022/11/07-2022/11/13) - kotatsugameの日記

まずTCO21 Semifinal 1。

https://community.topcoder.com/stat?c=round_overview&er=5&rd=18924

Easyは単純そうなdpだが適当に書いたらO(N^2C^2)になってしまう。到達できない状態が多いので、明らかなものはループの時点で弾いておけばよい。最初に提出したものは最大ケースでもチェックしたのにシステスでTLE落ち。dpのループの順番を変えたら枝刈りがやりやすい形になって通った。かなり時間がかかっていて暗雲が漂う。

Medは構築。最後のサンプルで=が強いことがわかる。前半の人と後半の人の対戦結果を常に=、それ以外の場所を=以外にすることで、前半のみ・後半のみから3人選ぶ場合以外は常に比較不能にできる。ただこれだけでは全然足りないので、前半のみ・後半のみの部分についてもできるだけ比較不能な三つ組を増やさなければならない。

解法ガチャをしばらくやっていたら正解を引き当てた。全体をS_1,S_2,S_3に分けて、a_i\in S_ii=1,2,3)についてa_1\lt a_2\lt a_3\lt a_1となるようにし、S_i同士については再帰的に決めるのが良い。実際どのくらいの数になるかは一切見積もらなかったが、試したら全ケース通った。

次にTCO21 Semifinal 2。

https://community.topcoder.com/stat?c=round_overview&er=5&rd=18926

Easyは1命令のみのプログラミング言語の実装で、プログラムもメモリに配置されていて書き換え可能なので複雑そうに見えるが、解いてみたらそんなことをする必要はなかった。答えをA倍するのをB回繰り返せばよい。特にA倍する部分は命令を愚直に並べられるので、1重ループが書ければそれでよい問題だった。

Medは解けず。N頂点のグラフのハミルトン閉路を探す問題になって、辺の数が少ないからdfsしたら求まるんじゃないかと思ったがダメ。大きな数から優先的に使うようにすると手元ではN=146くらいまで求まるも、そこでうんともすんとも言わなくなって埋め込みすらできなかった。

日付が変わってからは景気づけにPCK予選の問題を解いていた。数問なぎ倒したところでコンテスト30分前、集合時間になったためZoomに参加。そこからブレイクアウトルームに振り分けられて画面の共有を行った。

以下のようなことを言われていたが、そもそも複数枚の画面を一度に共有することができなかったので、アクティブなウィンドウだけ共有することになった。別のPCについては話題に出す時間がなかったので、黙ってシャットダウンしておいた。またこのとき英語が全然聞き取れなくて、監督者にはチャットで喋ってもらっていた。

参加者は競技中PCの画面を監督者に共有しなければならないらしい。モニターが複数ある人は全部。自分はそれに加え別のPCのモニターも目の前に固定された状態となるが、これについてはそのPCをシャットダウンしておけばよいだろうと思っている。念のため当日に確認するつもりだ。

週記(2022/10/31-2022/11/06) - kotatsugameの日記

午前1時、TCO22 Semifinal 1開始。あまり勝ち筋など考えず、気取ったこともせず、慎重に一問ずつ通すことにした。

https://community.topcoder.com/stat?c=round_overview&er=5&rd=19518

Easyから面倒。5000桁以下の数Nが与えられるので、ある数Xとその10進表記を反転した数を足し合わせた形で表せるか判定し、構築する問題。leading zeroは許されない。まずXの桁数として、Nと一致するかちょうど1少ないかの二通りしかないことがわかる。両方試すことにする。

X=\sum_{i=0}^m x_i10^iと置くと、Xとその反転を足し合わせたものは\sum_{i=0}^m(x_i+x_{m-i})10^iになる。このx_i+x_{m-i}の部分を取り出した数列が逆から読んでも同じになるように、各桁の値を分解できればよい。N=\sum_{i=0}^m n_i10^m、ただしn_m以外は一桁の数、と書いて両端から考えてみると、実はこの分解が高々一意であるとわかる。

例えばi=0のとき、x_0+x_mの十の位はn_mと、一の位はn_0と一致している必要がある。こうやって作った数をn_mn_0から引いて、繰り下がりを適当に解決した後i=1,2,\dotsと進んでいけばよい。面倒だがまあ書ける。

この問題は自分でテストするのも簡単。Xを小さい範囲で試してNとしてありうるものを列挙し、ちゃんと判定がうまくいっているか見ればよい。最初はN=1009で落ちていた。これはX=950などで達成できるが、x_0+x_m=19になって不可能と判定していた。とりあえずx_0+x_m=9と置きなおせば解決して、また丁寧に考えることでこのケースのみが問題だとわかる。実際、以降のテストでは落ちなかったので、提出。

Medは謎。dpでは書けないようだが状態数も少なそう。石が置かれたlevelの最大値を全探索して後ろから枝刈りで調べたところ、最大ケース周辺で十分高速だったので提出した。levelの最大値がたくさん約数を持つとまずいかもしれないと思っていて、変なところに最大ケースがありそうで不安。また、答えを合わせるのにすら結構時間がかかっている。

残り数分でHardをオープン。goodな数Xの最大値が小さいということだけ考えたところで終了した。

チャレンジフェーズ、今回は人数が少ないからか10分。最初にUm_nikのEasyを読んで、自分がN=1009に対処したときのようなコードが見当たらなかったのでチャレンジしたものの失敗。これで点数を下げてしまったので他の人にもノールックで投げることが頭を過ったが、おとなしくシステスを待つことに決めた。実際読んでみたら、多倍長整数を使っていたり微妙なところでdpしていたりで隙がない。

システスを待っていたらYouTubeの生放送を見てよいと言われたので見に行った。シークバーを弄ってコンテスト中の自分への言及を探しているうちにroomのchatが活発になって、何やら結果が出た雰囲気が漂っている。慌てて最新の画面を見たら、何人かの提出が落ちていた。

自分の提出が落ちていなかったためyes/noの最中だと思い、しばらくお祈りしていたが、全然画面が動かない。ちょっと巻き戻したらyes/noをやっているシーンが見つかって、ようやくさっきまで見ていた画面がシステスの結果だったと気づいた。

システス前は8人中7位だったが、システスで上から3人落ちてきて4位に滑りこんだ。Final進出!特に5位とは5pt差だったから、ノールックなんてやろうものなら一切勝ち目はなかった。ちなみにratedだったらしく、レート変化は2774→2845(+71)。

ふわふわした気分のまましばらくTLを見たり、YouTubeの生放送をチェックしたりしていた。自分のハンドルネームが「こたつゲーム」ではなく「こたつがめ」と読まれるようになっていて非常に嬉しい。touristが「こたつがめ」と言っているのはかなり現実感がない光景。また、システスで7位から4位になったことがcrazyとも言われていて面白い。

www.youtube.com

この発音については以下のシーンで一瞬話題になっていそる。

www.youtube.com

実は自己紹介の動画で、本当は「こたつがめ」と発音すると言っておいたのだ。それが以下。

www.youtube.com

TCO Finalsのための提出物を作り始めた。今日は自己紹介動画の撮影。

週記(2022/09/05-2022/09/11) - kotatsugameの日記

午前4時から3時間ほど日記を書いて布団に入り、ラノベを読んでいた。1冊読了。「キグナスの乙女たち」。

「新・魔法科高校の劣等生」と副題にある。外伝というには本編との関わりが薄く、新作というには濃い。こちらの主人公は司波達也世代が卒業してから1年後に魔法科高校に入学したので、昨日読んだ「メイジアン・カンパニー」より1年前の時系列ということになる。この2作は交互に刊行されているので、ネタバレ対策で自分もその順番で読もうとしていたが、このように年代が食い違っているのであまり注意する必要はなさそう。

内容は……やはり司波達也の雄姿が見たいという気持ちが強い。高校においてその名前が伝説となっていたため、話題に上るシーンがいくつかあったのは嬉しかった。正直なことを言えばこちらの主人公にはまだあまり興味を持てておらず、専らそのような描写を求めて読んでいたのだった。ただ明らかにメインではない。あとがきによればこのシリーズは「学園もの」らしいので、バトルすらあまりなさそう。めげずに読み進めていきたい。

午前10時過ぎ就寝。

11/18(金)

午後4時過ぎ起床。布団から這い出て午後4時40分からサークルのバチャに参加した。

https://kenkoooo.com/atcoder/#/contest/show/eb4e7d56-1580-4b4d-a8c1-7e016048c483

6問目のARC116-Eは合わせるのが難しい木dpだということを覚えていたのに、今日も1ペナ生やしてしまった。符号を切り替えて2種類の値を管理したら0で衝突してしまった。三つ目のサンプルがちょっと大きいのに弱めらしくて辛い。他は特に言うことなし。今日は参加者が僕含め二人で、感想戦もすぐ終わった。

その後日記を書いて、午後9時20分からyukicoder 368。

yukicoder contest 368 - yukicoder

Aは2\le i\le N-1に対して(i,N)を聞くことでP_1,\dots,P_{N-2}がわかる。最後に(N-2,N-1)を聞くことでP_{N-1}が求まり、P_Nは順列という条件から出る。

Bはちょっと難しい。P/Qが約分された形だとする。g=\gcd(N,M)N=N'gM=M'gとおくと\frac 1 N+\frac 1 M=\frac{N'+M'}{gN'M'}となった。これをさらに約分できるとしても、それは必ずgの約数によってである。つまりN'M'はこの形のまま分母に残るので、N'M'\mid Q。面倒だったのでN',M'\mid Qを全探索し、gは式変形で求め、出力する前にuniqueした。

Cは、1個しか出現しない数は後手によって削除され得る。1度消えると以降先手がいくら新しく作っても後手がまた削除してしまう。逆に2個以上出現する数は後手がいくら削除しても先手が新しく作れるので、ずっと存在し続ける。つまり先手は、最初の1手で2個以上出現する数だけ考えた時のmexを最大化すればよい。

実装にちょっと苦労した。最初の状態で2個以上出現していない最も小さな数を見つけて、それが0個しか出現していないならどうしようもなく、1個出現しているならどこかからもう1個調達できないか調べる。余った数を使うか、なければ最大の数を使うのが最適。

Dは最初(i\bmod j)=kとなる(i,j)を数えようとしたがうまくいかない。単に和を取る順番を入れ替えるだけでうまくいった。1\le j\le Mに対し、\sum_{i=1}^N(i\bmod j)\lfloor N/j\rfloorj多項式で書ける。商の列挙で\lfloor N/j\rfloorを全探索し、出現するj^0,j^1,j^2の和をそれぞれ閉じた形に直せばよい。

Eはちょっと面白い。xが一度AまたはBの倍数になると、以降xを大きくしようと思ったときに使える操作が高々一意になる。また、最初にX_A=\lfloor X/A\rfloor\times AとするかX_B=\lfloor X/B\rfloor\times Bとするかで二通りあるように見えて、例えばX_A\lt X_Bなら次は\lfloor X_A/B\rfloor\times B=X_Bとなって合流してしまう。

この場合、最初にX_Bとするケースは無視してよい。X_A\gt X_Bの場合も同様で、結局操作は初回を含めて常に高々一つしかないと思える。よって値を大きくし続ける操作列の長さを見れば答えがわかる。A\le Bとして、一度Bの倍数になった後を考えてみよう。

次はAの倍数になるが、この値は必ずx+A-1\lt x+B以下である。さらにその次はBの倍数、もっと言えばx+Bになるので、2手でx\rightarrow x+Bが行われる。これをx{\rm lcm}(A,B)の倍数になるまで繰り返すから、この間の操作回数は簡単にわかる。これで解けた。

Fも少し面白い。追加した辺がない場合の答えは一般の木のように各辺が使われる回数を考えれば求まる。辺を追加したことでなもりグラフになっているので、そのただ一つのループについて、新しく追加した辺を通る弧を使えば距離が近くなるような点対を考え、その分答えを減らす。

ループの頂点数はO(N)なので、各頂点から生えている木のサイズが求まる。あとはループのどことどこの距離が縮んだかペアを全列挙して、どれだけ縮むかを木のサイズで重みづけすることでとりあえず答えは求まる。式が扱いやすいので2重ループを1重にするのも簡単。木のサイズを求めるのに結構時間を使ってしまった。

全完後は日記に戻っていた。午後11時半からはCF #834 div.3。

Dashboard - Codeforces Round #834 (Div. 3) - Codeforces

AはYesの途中から始まる場合が面倒そうだったので、先頭の文字を見てY始まりに揃えてから判定した。Bはbがdistinctなのに気づいていなかったが他はよい。Cはa\rightarrow bの間に何も挟まないか、lまたはrを挟むか、両方挟むか全探索。

Dはn\mid x\times 10^kかつx\times 10^k\le nmを満たすxがあるか、k=18から降順に判定。xn/\gcd(n,10^k)の倍数となる。最初、値も最大化しないといけないのを忘れていて、書き直すのにも少し手間取ってしまった。

Eは三つのserumをどの順番で使うか全探索。吸収は貪欲に行ってよい。Fはa_np-1までインクリメントする過程で達成されるか、そこからさらに1足した時の繰り上がり処理で達成されるか、どちらでもないかを判定。出現していない数を探すのは、出現した数を入れたsetを舐めれば十分高速。Gはnから降順に見て配置。置ける位置のうちできるだけ後ろに置くと辞書順最小が達成される。

30分ちょっとで全完、2位。FGが結構速かったらしい。Dで手間取ったのが痛い。Gについてはこの方針が大正解で、データ構造を持ち出して頑張った人をTLで結構観測した。

また日記に戻っていたが、TCB53に参加しておかないといけないのを思い出し、午前1時から参加した。

https://techful-programming.com/user/event/3529

4問目まではよい。5問目はテーマがデータ構造だからと言ってこの位置にBeatsが置かれるわけもなく、制約が小さいので愚直が通る。6問目はO(3^N)。最初のループでダメなケースをちゃんと弾いたり、一つ要素を固定してどの集合に入れるか決め打ったりすれば十分高速。

7問目は各rに対して最大のlを尺取りで求める。値ごとの出現回数を管理するテク。Yの取得にはセグ木を使った。8問目は下位2要素を管理するセグ木だと思ってあらかじめ書いていたが全然違った。値をソートして昇順に舐め、それが2番目の最小値となる区間を数える。

ここまで理論値で一息ついたが、残り2問は両方手間取ってしまった。

9問目は部分列を部分文字列だと思い込んで実装してしまった。これで冷静さを失い、何をやっても解けそうなのにどうやるのかわからない状態にしばらく陥る。最終的には、各文字についてその後ろにある最も近い次の文字の位置を管理することで、各aに対しそこからスタートした場合のXの末尾を求め、これをダブリングしてカウントを高速に行えるようにした。今冷静になってみれば、次の文字の位置それ自体をダブリングしたほうが簡単だった。

10問目はi=N,\dots,1の順に解いた。SAとLCPを使いどこまでが以前に出現したことのある文字列か判定し、Si文字目が0でない場合に残りを新しい値として加える。この新しい値をまとめて取得するために遅延セグ木を使った。i\le j\le Nに対し、Si文字目からj文字目までを数値と見たときの値を保存する。

更新では新たな数を先頭にくっつける必要があるが、その「先頭」が10の何乗の位かも持てば可能。つまり、(a,10^k)というペアを持っておき、新しい数sをくっつけるときに(a+s\times 10^k,10^{k+1})とすればよい。サンプルがなかなか合わずかなり迷走。特に遅延セグ木の更新部分を疑っていて、情報が足りないのかと思いいろいろ追加してしまった。いったん紙の上で整理してからもう一度書き直したらすんなり合った。

9問目が制限21分のところ22分40秒で-2pt、10問目は24分のところ24分47秒で-1pt。まとめると、1時間ちょっとかかって理論値-3ptである。問題は別に難しくないので理論値も数人いるだろう。連覇は前回で終了。もっと盛大に時間オーバーしていると思ってかなり適当に投げてしまったが、WAが出なかったのはよかった。

日記に戻って書き続け、午前5時頃布団に移動した。そこから今日もラノベを1冊読了。「メイジアン・カンパニー」2巻。

この巻は主人公以外の視点が多く感じられた。1巻はストーリーに勢いをつけるために主人公が多めに動かされただけで、今後はこのくらいで進行するのだろう。それでも要所要所でしっかり決めてくれるので嬉しい。魔法を放たれた相手視点の描写もあってより満足できた。3巻の帯にはいよいよ大規模な魔法を使うと書いてあるので、さらに楽しみである。

午前7時半就寝。

11/19(土)

午後2時起床。午後2時半からOpenCupの代理コンテストに出た。

Petrozavodsk Summer 2022. Day 5. ZJU Contest 2 - Dashboard - Contest - QOJ.ac

OpenCup

  • 1430-1930 OpenCup

  • -2000 振り返り

休憩と称して少しYouTubeを見ていた。QuizKnockが言語学オリンピックを扱った動画を出していてびっくり。かなりの宣伝になりそう。ただ、時間がなくてまだ見られていない。

午後10時からのTCO Finalに備えてTCO Tシャツに着替えたり洗濯物を取り込んだりの準備をしていた。Zoomに集合するのは午後9時半の予定で、木曜日と同じなら画面共有するまでさらに10分から20分ある。しかしそれまでにABCが一段落しているとも限らないので、あまり当てにはできない。

午後9時からABC278に出た。

AtCoder Beginner Contest 278 - AtCoder

Aはよい。Bは面倒。Cはmapの値としてsetを持った。ペアのsetを持つほうが楽だったか。Dは直近のクエリ1のタイミングと、配列の各インデックスに対してそこを最後に更新したタイミングを覚えておいた。値を見に行ったとき、それより後でクエリ1が来ていたらインデックスに対する値は破棄する。

Eは各整数についてそれが見えなくなる組(k,l)を数えた。その整数が出現するX座標・Y座標の範囲を求めると、それを覆い隠せる(k,l)は長方形領域になるので、全部まとめて2次元imosでカウントする。O(HW)。imosの部分は愚直に足しても間に合う制約だが、焦っていて計算量の見積もりがうまくできなかった。Fはやるだけ。

午後9時半まで10分ちょっと残しGに突入。しかしかなり苦労した。区間の長さに対してGrundy数を計算する。よく見るとこの時点でO(N^3)かかっているが、焦りすぎて気づいていなかった。計算と同時にその状態を達成するような操作方法も覚えておくと、後の操作が高速に取得できる。残っている区間はsetで管理した。

区間の左端を0に揃えたような形で操作の情報を持っていたら、ジャッジから返ってくる操作の情報もそれと同じ形式で取り扱ってしまい2WAした。45分ごろ何とかAC。

ABCの振り返りとコードゴルフは、それぞれTCO後・朝方に行ったがここに書いておこう。少し時系列が前後することになる。Exは問題を読んだだけで考察する時間すらなかったものの、かなり難しい問題だったようで、7完で7位を取れた。Gで何も考えずO(N^3)を書いてしまいすみませんという気持ち。Eに比べてFが簡単すぎると感じたのに、結局Eのほうが倍解かれていてびっくりした。

コードゴルフ。Aは相変わらずVimが短かったらしい。今日は何も考えていないので悔しがる権利すらない。Bはやる気が出ない。パターンが少ないらしく、場合分けする解法が最短になっている。CDはAWK。以降は手付かず。

午後9時半からはTCO FinalのZoomに参加していた。案の定集合待ちの時間が発生していて、その間にギリギリでGのデバッグを完了することができた。直後から画面共有を開始して、午後10時からTCO22 Final。

https://community.topcoder.com/stat?c=round_overview&er=5&rd=19522

Easyがあまり見ないタイプの問題で非常に苦しかった。75分ほぼ全部をこの問題のために費やした。順列を、区間の反転操作によってソートせよという問題。ただしこのとき最適な操作回数の2倍以下の手数で達成する必要がある。つまり2-近似アルゴリズムを構築せよという問題。

しばらく唸っていたら、隣接項の差が1でない箇所に注目するのがよさそうだと気付いた。順列がソート済みであればそのような箇所は存在せず、またどんな操作によっても高々2箇所しかそろえることができない。つまり1手で1箇所揃えられれば必ず2-近似になっている。

ただ、1手で1箇所そろえる手順すらわからない。ここで頑張って考察を進めるのではなく変な戦略を実装し始めてしまった。順列を隣接項の差が1であるような区間に分割すると、それらを1要素に圧縮して値の大小関係で再度番号を振りなおしたものがまた順列になる。これでサイズを小さくした問題を解き、要素を区間に戻して、反転してしまっている区間を直すというもの。インデックスの管理に苦労しながらなんとか書ききった。

この問題はテストケースも特殊。順列の長さは50以下だが、ジャッジのためには最適な操作回数を知る必要があるため、システスにはそれが計算できた順列しか含まれない。このためチャレンジは全探索できる長さ9以下の順列に制限されていた。正確にはシステスの内容をエスパーすればそれも使えるらしい。ともかく、チャレンジで入力されるケースがわかっているなら試さない理由はない。

実際に全探索して実行した。そもそもバグ修正にかなり時間がかかり、直った後も操作回数が多すぎて全然ダメ。そこで、サイズを小さくする過程で端から貪欲に揃えた場合も計算し、手数の少ないほうを採用した。左からやっただけでは落ちたが右からもやるとなぜか通る。かなり不安になる解法だがとりあえずチャレンジはされない。時間もないので提出した。

Medを開いて題意を理解したあたりでコンテスト終了。チャレンジはEasyを眺めていたが特に何もできなかった。隣接項に注目するのはよくて、さらに左端・右端の差も考慮すべきらしい。それができていればもうちょっとまともに解けたかな、という感想。

生配信でシステスを見守った。不安だったEasyが幸運にも通り、何とか正のスコアを確保できた。6位で賞金争いからは程遠いが、Finalという舞台で問題を解けたという事実にまずは満足したい。またしてもratedだったらしく、2845→2878(+33)。Finalsで合わせて+104した。

www.youtube.com

その後朝までDMOJでコードゴルフコンテストに参加した。期間の終了は火曜日だが時間制限がなく、いつ参加してもコンテスト自体の終了まで何度でも提出することができる。

Lyndon's Golf Contest 1 - DMOJ: Modern Online Judge

少しABCのコードゴルフをして午前7時半就寝。

11/20(日)

午後0時45分起床。午後1時からOUPC2022に出た。

https://onlinejudge.u-aizu.ac.jp/services/room.html#OUPC2022

OUPC

  • 1300-1700 OUPC

  • -1800 Hのupsolve

  • ロドリゲスの回転公式

眠気が強いため布団に入り、午後7時から午後9時直前まで仮眠していた。起きてすぐARC152。

AtCoder Regular Contest 152 - AtCoder

Aは帰るなら二人組。なので二人組を座らせないよう端から1マスずつ開けて座ってみて、どこかで座れない二人組ができるかチェックした。400点だったので身構えていたがすんなり解けた。

Bはよくわからなくてエスパー気味に解いた。サンプル1は出発する休憩所を同じにしても達成できて、このとき説明にある休憩時間を一つにまとめることができたと思える。つまり一般に、同じ休憩所から出発するような最適解がありそう。その休憩所を全探索すると、すれ違うもう一つの休憩所は二人がそれぞれLだけ歩いた先にあってほしい。ちょうどその位置にない場合も左右で最も近いものを探してそれぞれかかる時間を計算し、最小値を出力した。出したら通って安堵。

Cはかなり頑張った。操作によって最大値と最小値の差は変わらないので、最小値を最小化する問題になる。この値をx、最大値と最小値の差をWとおき、各a_ixからどれだけ大きいか表していると思うことにする。つまりa_1=0a_N=W。ここからa_iによって操作してみよう。

本来の値はa+xであった。a_Nは実はa_N+xで、これをs=a_i+xで操作すると2(a_i+x)-(a_N+x)=2a_i+x-a_N=2a_i+x-Wになる。これが新しい最小値x'であり、操作できる条件がx'=2a_i+x-W\ge 0と表せる。そのほかの要素も同様に、ただしオフセットをx'とするところまで含め、a\rightarrow 2(a_i+x)-(a+x)-x'=2a_i+x-a-(2a_i+x-W)=W-aとなる。全体を反転しているので当たり前で、もう一回操作すると元通りになる。

最小値が同じでも列が反転されているかそうでないか二通りあるのが扱いづらいので、反転後の列に対しては最小値に負号をつけてみる。x=x'=0のケースは答えがWとわかるので区別しなくてよい。x'=W-x-2a_i\le 0となるが、ここからもう一度操作する場合どうなるだろうか。

本来の値はW-a_i-x'である。今の最大値はW-a_1-x'=W-x'なので、これをs=W-a_i-x'で操作すると2(W-a_i-x')-(W-x')=W-x'-2a_iとなる。これが新しい最小値x''であり、上と同様操作できる条件はW-x'-2a_i\ge 0でよい。なんと、x'x''の形が同じになった!

コンテスト中は大変興奮したものだが、符号を反転することを考えた時点で図形的意味を考えればもっとわかりやすかったかも。つまり数直線上で2sだけ左右に動かしているのだ。しかも、いかにわかりやすくなったといっても解法には直接は寄与しなかった。

2回続けて操作するのをまとめて考えてみる。それぞれa_ia_jによるものとすれば、まずW-x-2a_i\le 0、次にW-(W-x-2a_i)-2a_j=x+2a_i-2a_j\ge 0。例えばa_i=a_N=Wa_j=a_1=0としてxを十分大きくすれば条件は考えなくてよい。つまり自由にa_ia_jを選んでx2(a_i-a_j)を加えられるので、g=2\gcd_{i,j}(a_i-a_j)単位で調整できる。

つまり偶数回操作するならx\bmod gが答え。奇数回操作するなら最後の一回を全探索し、ちょうどいい感じになるように改めて調整すればよい。かなり大変なステップを辿ってきたので半信半疑で提出。一発で通ってびっくりした。

D。N-1は偶数なので、Nは奇数。\gcd(N,K)=1の場合は簡単。そうでない場合、例えば(N,K)=(9,3)を考えた。9角形の上に3角形を三つ書いた図で考察していると全然構築できなかったが、何気なく036147258という3\times 3のマス目を書いたのが大正解で、こちらで捉えなおすとすぐうまくいった。

より一般には\gcd(N,K)\times(N/\gcd(N,K))のマス目になるが、縦横両方奇数なので3\times 3の場合を拡張することで構築できる。方法は公式解説にあるもの(を回転・反転したもの)と一緒だった。実装時は実際にマス目を作って辺を張るとやりやすい。

Eは謎。全体のXORは0なので、重みwのボールとその左の総XORLに対し、右の総XORはL\oplus wと書ける。例えばw_1の場合、左に進んでいくと困るためL\le L\oplus wL=Zを使って書き直すとZ\le Z\oplus w_1が必要。

次にw_2について、最初に左に進まないならZ\oplus w_1\le Z\oplus w_1\oplus w_2、左に進むならw_1とくっついた後さらに左に進んではいけないのでZ\le Z\oplus w_1\oplus w_2となる。Z\le Z\oplus w_1がわかっているので、最低限必要な条件はZ\le Z\oplus w_1\oplus w_2にまとめられる。

より一般にZ\le Z\oplus w_1\oplus\dots\oplus w_iになりそう。つまりZw_1\oplus\dots\oplus w_iの最上位bitを持っていてはいけない。同様のことを右から、つまりw_i\oplus\dots\oplus w_{2^N-1}についても行い、持っていてよいbitを数えればZの種類数が求まる。

実際にはw_1\oplus\dots\oplus w_i=w_{i+1}\oplus\dots\oplus w_{2^N-1}なので、右から行う必要はない。これまた半信半疑で出したら通った。かなり素早く解けた。

40分近く残してFに辿り着き全完もあるかと思ったが、解けなかった。1からNまでのパスとそこから生えた木を考えればよいことしかわからず、両端の木の頂点数が極端に多いケースだけ処理して提出してみるも、当然のようにWAだった。5完7位。

コードゴルフはA問題のみ。解説に二人組のインデックスを使う簡単な式が書かれていたので、それをdcで実装した。

午後11時半からCF combined。

Dashboard - Pinely Round 1 (Div. 1 + Div. 2) - Codeforces

Aは全体が一致しているか、そうでないならa+b\le n-2である必要がある。この-2は二つの順列を違うものにするために必要な分。

Bはどれか1要素を残して操作していくのがよいと思い、出現回数が最も少ないものを見て答えた。しかし3ケース目でWA。改めて考えなおすと、連続する3要素が相異なる位置があれば、そのような位置が操作後も残るようにできることに気づいた。つまりこの場合の答えはn。そのような位置がなければa_1a_2が交互に並んでおり、答えはn/2+1だとわかる。

Cは最初にA_i=\{i\}として、条件を満たすようトポロジカルソートしながら集合の和を取っていけばよい。

Dはcarryが発生する桁の区間がいくつあるか考える。そのような区間は、最下位桁が(1,1)で、最上位桁のもう一つ上が(0,0)で、間は(1,0),(0,1),(1,1)であり、1桁につきちょうど1だけcarryが発生する。またcarryが発生しない桁は(0,0),(0,1),(1,0)のどれかである。2^{n-1}の位でcarryが発生するかどうかでパターンを分けると、あとは3のべき乗や重複組み合わせを掛けることで求まる。

Eは大変だった。初手で結構な時間をかけて選ぶ頂点集合が連結であることを示せたと思ったのに、そこから先に進めたわけでもないしそもそもその結論も間違っている。

どの頂点を選んでも、それともともと連結でなかった点は全部繋がる。つまり選んだ頂点がもともと属していた連結成分がどうなるかだけ考えればよい。クリークは全部一気に選ぶしかないため、そうでない場合を見た。クリークではないので頂点uvであって辺uvがないものが存在する。uだけで操作してみる。

uを削除したときの連結成分それぞれについて、uからの辺があるかを考える。最初の状態で、ある成分のすべての頂点からuに対して辺が出ていれば、uで操作したときその成分が孤立してしまう。そういうものがなければよい。あれば、適当に選んでAとし、今度はAの適当な頂点wで操作したときのことを考える。

これによって、wから(A\setminus\{w\})\cup\{u\}以外の頂点に対して辺が作られる。特に辺uvが存在しないことからv\notin Aなので、wvという辺ができる。さらに、最初の状態でuを削除するとvwが非連結になることから、wを通らないuvパスが存在すると言える。これはwで操作した今も変わらず残っている。

二つを組み合わせることでwuが連結、さらにuA\setminus\{w\}の各頂点の間には辺があるので、ここも連結になることがわかる。以上よりすべての頂点が連結になった。

ここまででもかなり時間がかかっているのに、さらにクリークの扱いでWAを重ねまくってしまった。1頂点や2頂点のクリークがあればそれを全部選ぶのがよい。3頂点以上のクリークしかない場合も、クリークがちょうど二つであればサイズの小さいほうを全部選ぶしかない。三つ以上ある場合、なんと適当なクリーク二つから1頂点ずつ選べば全体を連結にできる。これに気付くのが非常に遅かった。初手で示したつもりだった、選ぶ頂点が連結という命題への反例となっている。

Fは解けず5完、しかもかなり遅めで192位。2681→2631(-50)。Eは次数最小の頂点を選ぶとうまくいくらしい。

TCB53が終了していた。理論値が一人しか出なかったようで、それに続く2位。しかしその理論値の方には時間でも負けている。まさに完敗。

昨日に引き続き、今日も朝までDMOJのコードゴルフ大会に時間を投入してしまった。午前6時からは日記を書いていた。

途中、土曜日の日記で言及したQuizKnockの言語学オリンピックを扱った動画を見た。2問目のふくらPさんがすごすぎる。この問題を解くにあたって何をする必要があって、さらにどうすればそれができるのかを完全に理解している。言オリの問題に初めて触れたとは思えない。

須貝さんは動画を見る限りでは1問目の解答の理由があいまいで、クイズのように何回も回答できたら多少はあてずっぽうで解いてしまうよなあと思っていたが、3問目はしっかり考察に基づいて正解を勝ち取っていてこちらもすごい。

www.youtube.com

日記が全然書き終わっていないまま布団に入った。少しだけハーメルンを読み、午前9時就寝。