週記(2022/06/06-2022/06/12)

06/06(月)

先週の週記を投稿してから。午前9時過ぎに布団に入って、ちゃんと7時間くらい眠れるな~と思っていたのに、うっかりにじさんじ非公式wikiを読みふけってしまい結局就寝したのは午前11時半だった。ちなみにベルモンド・バンデラスさんと社築さんの記事を読んでいた。

午後4時起床。回していた学習の記録をグラフにプロットするなど準備をして、インターン先の定例会に臨んだ。先週はバリバリ進捗を産んだのでかなり気が軽い。ノリノリで発表した。

勉強会は先週日曜日に終了したAHC011の話。僕は結局初日に1Bの解を提出しただけ(しかも時間差で最短を取れていない)だったが、順を追って説明されることで何となくの全容を把握することはできた。印象的だったのは、「目標の全域木を作ってスライドパズルを解く」という方針を得る方法。初日のmaspyさんのスコアを1ケース当たりに直してみると、スコア関数の定義から全域木を作るのが前提の戦いだとわかるらしい。またこれはスライドパズルという問題の性質からも必要で、何故かというと目標の盤面とどれくらい離れているかでしか現在の盤面を評価できないから。なるほど確かに、解いている途中で得られた木の大きさになんて微塵の価値もない。

今日の夕方あたりにニコニコ動画の「おとわっか」が削除されてしまったらしい。ちょくちょく再生していたので寂しい気持ちになった。諸行無常。最初はヤマダ電機からのコネクトパートばっかり注目していたのだが、さすがにMADに失礼だと思って全編通して視聴するのを繰り返した結果、その前のダダダダ天使パートが好きになってきていた。

【合作】おとわっか - ニコニコ動画

眠気をこらえ、今日が期限の課題2つと明日期限の課題を1つ倒す。まず最初はゲーム理論。手書きだと読みづらいからWordかTeXで書けというコメントが出ていて、仕方なくWordで。思ったより戦略系ゲームの表を作るのが簡単だったのは良かった。ゲーム木を書けと言われるとまた困ってしまうが、それ以外だと圧倒的にWordのほうが良いな。そもそも図表を作成するのが面倒という先入観から手書きを好んでいたのだった。

次にハードウエア基礎論。ちょっとよくわからなくなってきた頃合いだな、と思いつつ講義スライドを眺めて、課題を開いたら特にスライドに言及のなかった計算問題ばかり並んでおり大変びっくりした。スライドではなく講義動画を視聴したらまた違うのだろうか。何とかそれっぽいことはできそうだったので、上手く空気を読んで手を動かし、何とか今回も全問正解で終えられた。Googleフォームを利用した課題なので点数が即座にわかる。

完全に集中が切れてしばらくYouTube。やはり人が喜びを爆発させているシーンは良い。音ゲーの話題ということもあって、この配信が当時のトレンドに乗っていたのを見聞きした気がする。記憶の捏造か?当時何やってたんだろうと思って日記を読み返したら、ラノベを3冊読んだ日らしかった。最近さっぱり読めてないな……。

www.youtube.com

本当はサークルの運営とかICPCに関する記録のまとめとかしなければならないことが確実にあったのだが、ラノベを3冊も読んだらたいていのことはどうでもよくなる。積読を減らしたので、今日何もしていないわけではないと自分で信じられるのが大きい。

週記(2020/11/09-2020/11/15) - kotatsugameの日記

日付が変わってから火曜日期限の課題、離散数学のものを提出した。同値関係であることの証明を3つの性質それぞれで書くのが少し面倒だった。

ありえないくらい眠い。すぐ布団に入って、少しハーメルンを読んで午前1時半に就寝。

06/07(火)

なかなかスッキリとした目覚めで、これは睡眠負債もかなり返済できたかな?と思いつつ時計を見たら午前6時半だった。明らかに睡眠時間が足りていないので一刻も早く二度寝しなければならない。なのにやたら寝起きが良く、全然眠れなかった。

しばらくYouTubeを見て、ハーメルンの更新をいくつか読んで、なろうを読んで、午後2時になってようやく二度寝。次に起きたのは午後8時だった。

またずっとなろうを読み続けて、午後11時半からCF #797 div.3。ところで最近、CFのURLをブログに埋め込むときにタイトルを表示する機能がうまく動かなくて悲しい。以前までだったら以下のリンク文字列は「Dashboard - Codeforces Round #797 (Div. 3) - Codeforces」のようになっていたはずだ。自分で書くこともできるが、面倒。

https://codeforces.com/contest/1690

Aは出力がh_2,h_1,h_3の順番であることに気付くのが難しい。Bは\max_i a_i-b_i回だけ操作して達成できているかチェック。各iについて、a_i-b_i回ちょうど操作するべきか、またはそれ以上の回数なら何でもよいか決まるため、どちらにしろその\maxをチェックすれば事足りる。Cは直前の仕事が終わった時間を記録して前から見る。Dはさすがに自明。Eは微妙に難しくて、a_i\leftarrow a_i\bmod kとすると、ペアであって和がk以上となるものの個数を最大化する問題になる。ソートしてa_iが大きいほうから見て、必要最低限の値とペアにしていくのを繰り返すのが最適。

Fはいつもの置換の周期を求めるのを、ループの長さの代わりに文字列の周期を使って計算する問題。文字列の周期については長さの約数を全探索したので、最悪ケースでもO(n\sqrt n)になっているはず。この問題、マルチテストケースのくせして\sum nに制約がない。このことにコンテスト後になって気づき冷や汗をかいた。Gは累積\minが更新されるインデックスをsetで持って追加・削除を繰り返す。各クエリはまずkがsetに入るかチェックして、入るならその後ろの要素をどこまで削除するべきか順に試していく。

全完時点で3位、その後ペナ差で抜かれて6位に落ち着いた。

PCのSSDが画面キャプチャのストックで圧迫されてきたので、悪い成績だった回やAtCoder以外のコンテストに参加した時のキャプチャを削除した。とりあえず70GBほど空けたので一安心。正直、ある程度昔のものは全部削除しても良さそうな気がしている。古いものよりは新しいものを編集するべきであるから。ああ、前にA問題のACシーンだけを集めた動画というのを考えたのを思い出した。これを作るとしたら、今日いくつか完全削除したのは失敗だったかもな。

先ほどのCFは、初めての試みとして音声も拾いつつキャプチャしていた。コンテスト開始まで少しのカットと、一部映ってはいけないものにぼかしを入れるだけの編集をサッと済ませてエンコードし、投稿。いわゆる生声実況のつもりだったが、特に問題文を翻訳して読み上げたわけでもなし、ただただ僕がボヤいているだけの動画になってしまった。これも実況であると強弁している。順位は確定後にサムネに入れておきたい。open hacking phaseで僕のコードがHackされたらどうしよう……。

www.youtube.com

YouTubeにじさんじの公式番組に熱中。にじさんじ無人島シリーズを3本一気に見てしまった。演者を一切映していないのに普通に違和感なくバラエティできているのはすごい。ところどころでしか3Dモデルが使われていないから、おそらく動きだけスタジオで別撮りしたのだろう。それ以外の部分はなんと声だけで面白い動画が構成されている。サバイバルもガチ。ガチでやっているのに動画に映った部分は演者の影の映り込みもないのが本当にすごい。

www.youtube.com

しかしこうやってにじさんじの公式番組に熱中するのと、地上波のテレビ番組に熱中するのには全く違いがないように思える。僕がテレビをあまり見ない人間だったのは、つまるところ出演者に興味がなかっただけの話だったらしい。大学生になったとき、下宿先にテレビを置かないことで今後もテレビ番組から身を遠ざけようとしていたのに、今こうやってYouTubeで漁りまくるようになってしまい台無し。しかし一片の悔いなし。

朝方から日記を書き始めた。月・火のぶん。結構時間を使い、午前9時半就寝。

06/08(水)

午後4時半起床。しばらくPCを触ったりして、午後6時に家を出発した。今日はゲーセンに行く。空模様が怪しいので自転車は使えない。

家と地下鉄駅とゲーセンの位置関係を考えたとき、地下鉄に乗るのと歩き通して行くので時間的にあまり違いがないのでは?と考え、試しに歩いてみた。実際、地下鉄のタイミング次第とはいえ平均的には同じくらいの時間でゲーセンに到着できそう。今日は途中で寄り道して油そばを食べ、ATMでお金を下ろした。

午後7時から閉店までゲーセン。新曲を埋めた後、14+の新規AJを狙っていた。今日は3曲。

前半が苦手。特にフリック混じりのスライドとタップをそれぞれ別の手で処理するところが全然安定しなかった。焦ってリズムがうまく取れない。後半はおおむね上手で、一番最後、高速の交互から切り替わった4鍵の最後だけ結構失敗しがちという感じ。確か2敗。前半で失敗することが多くなり捨てゲーが連続して、今日は止め時かと思っていた頃合いでかみ合った。しかも最高精度。ラストのホールド・スライドの右の始点で2個出したのがちょっと残念か。まあそれがなくても9950には届いていないので、気にしてもしょうがないと割り切れている。99AJというだけで十分。

NEWになってすぐの頃にSSS+狙いで粘着していた運指を覚えていた。久しぶりにプレイしてみたところ、一発で何もかも上手くいった。かなり危ないところもあったなという感じなので、決め切れてよかった。今日は1-0や0-1を多く出していたし。しかし精度はあまりよくなかったと思っている。謎の赤が多かった印象。

たった4回で決めることができた。出したのはラスクレの2トラック目。これで出なかったら最後は別の曲をプレイして終わろうと思っていたので、ギリギリ。5鍵と高速4鍵は擦って、第二発狂(と呼ばれていたはず)はノーツを増やしてトリルと読み換える。ここまでは昔組んだ運指で、他の鍵盤は見たまま押すことができた。BPMが遅めなのでかなり余裕があるが、それにしても本当に上手かった。精度も良いと感じる。赤の数的には水晶世界と変わらないとはいえ、こちらはそもそもAJが出るだけで万々歳だからか。

立ち食いそばを食べて帰宅。疲れ果ててパソコンデスクにへばりつき、いくつか動画を視聴した。

www.youtube.com

先週視聴して日記にも書いた犬山たまきさんの3D LIVEのうち、恋愛裁判カバー部分だけを抜き出した動画。好みのシーンだったが1時間超の動画の一部なのでループ再生には向かないなと思っていたところだったので、大変助かる。ただのLIVE切り抜きではなく歌動画となるように編集されており、茶番シーンがばっさりカットされていた。それもまたいいよ。

www.youtube.com

15分11秒時点。この頃渋谷駅前のスクランブル交差点にデカデカと掲示されていた、花譜さんの武道館ライブの広告が映り込んでいる。思いがけず嬉しい気持ちになった。しかしこのような、明らかに動画の主題ではないことに反応するのはちょっと申し訳ない気持ちになるな。日記には好き放題書くがツイートするかどうかはしばらく悩んだ。

www.youtube.com

懲りずにまたにじさんじの公式番組で夜を明かした。その中から1本。剣持刀也さんがロリコンロリコン言われているのはしぐれういさんの切り抜きばかり見ていた頃から知っていたが、こうやって実際に幼いアバターVtuberに挟まれたときは普通の好青年になっていて、純粋にゲーム実況的な面白さがあった。この辺り弁えているからこその人気なんだろうなと感じた。ラストでスタッフを煙に巻くシーンがあって、急に入社日マウントを取り始めるのが本当に好き。話題とは一切関係ないことをすぐに持ち出せる発想力がすごい。22分27秒時点。

https://www.youtube.com/watch?v=KwxIJYdRl3s&t=1347s

昨日のCFのopen hacking phaseが終わっていた。全完6位のまま変わらないということで確定したので、アップした動画にサムネイルを入れた。

かなり眠い。日記は清書せず、今日やったことをサッとメモだけして午前5時半就寝。

06/09(木)

正午起床。昨日、にじさんじ運営会社のANYCOLORが上場したことを知った。さらなるご躍進を祈念している。

ANYCOLORが東証グロース上場、時価総額1652億円に。躍進続ける「にじさんじ」の魅力とは?【UPDATE】 | Business Insider Japan

準備して午後1時半に家を出る。まず学食で昼食。先週、納豆にはレジ1回につき1パックしか買えないという制限があることを知った。そこで今日は、最初に1パック買って席に置いた後、即座に戻ってもう1パック買った。納豆を見せると2回目かと確認されて、「2回目のレジだ」と答えたものの、プリペイドから引き落とされてしまった。これは納得いかないと「1回のレジで1パック」という制限であることを主張した結果、会計をやり直して、今度こそちゃんとミールカードで購入することができた。おそらく「1回のレジで1パック」という制限を「1食につき1パック」と勘違いされていたのだろう。

先週の一言カードには、日記に書いたような経緯と、納得いかないルールなのでなくしてほしいという要望を書いた。これに関する回答は次のようなものだった:「ミールカードのこのような制限は組合員の食生活を守るために設けている」「従業員間で再度ルールの確認を行う」。まず前者から、食生活を守るという目的なら何かを1食につき1個と制限するのはおかしな話ではない。しかし実際のルールの文言ではそのような制限のかけ方になっていないわけで、だのに存在しないルールを適用しようとされるのは後者ができていないことになる。1週間もあってルールの周知ができていないと見るか、まだ1週間しか経っていないと見るかは内情を知らないので何とも言えないが。

「食生活を守る」という目的を聞いて、「1回のレジ」を「1食」のことだと忖度することは可能だが、しかし僕がわざわざそのような解釈を行う必要はまったくない。もともと学食のレジ担当者はルールがガバガバなことが多く、それに甘えてきた経緯もあるので、正しくルールを適用されるなら諦めも付く。しかしより厳しいほうにルールを誤解されるのは我慢ならない。今日はそういう感じで一言カードにクレームを書いてきた。ちなみに、先ほど言っていたような忖度の話は敢えて触れていない。話が通じない人という空気を醸し出そうとしている。

一言カードを書いていたら遅くなった。午後3時開始のセミナーに少し遅れて到着。今日の前半はもう一人の発表で、教科書にあった天才的な構築について、全員で考えても結局よくわからないという結論になって終わった。もともと彼一人だけ発表する予定で、このままでは午後4時半と少し早い時間に終わりそうだったので、せっかくなら少し話したいと主張して僕も発表することに。意気揚々と黒板の前に立ったはいいが、1週間前に準備で読み返したきりの内容、しかも少し複雑な証明だったこともあり、再現するのに失敗して炎上。最終的に何とか補完できたものの、午後6時前までかかった。先週考えていたことは不正確で、十分に性質を拾い切れていなかったようだ。

午後6時に終了して帰宅。疲れ果ててなんと4時間以上YouTubeを見たりにじさんじ非公式wikiを読んだりしていた。

www.youtube.com

www.youtube.com

www.youtube.com

www.youtube.com

www.youtube.com

今日はぐんかんという、Vtuberテーマのネット小説で見たてぇてぇムーブを現実でやってしまっているにじさんじの男女コンビを発見して、一瞬で夢中になって脳を破壊されていた。実は僕「てぇてぇ」という言葉がまともな日本語と思えずあまり好きではなかったのだが、確かにこういうムーブを見せつけられると口角上がりまくってまともな語彙を失ってしまう。男女のライバーで身体的接触を行える、またそれを許容されるような関係性はさすがにフィクションにしか存在しないと思っていた。マジで最高すぎる。

セミナーの途中に先生にこういうものを作れないかと言われていたプログラムを書いてメールで送信した。行列計算や統計処理が含まれるもの。R言語で実装できないか聞かれたが、自分はそれを使えないのでOctaveで書いた。

またYouTubeに戻る。それと並行して、おすすめのなろうまとめの編集を再開した。しかしついうっかりなろうの読み返しを始めてしまい、そのまま朝まで戻ってこれなかった。馬鹿野郎。「最強魔法師の隠遁計画」は読んだのが高校生の頃で今の好みから外れたかと思っていたら全然そんなことはなく、昔好きだったシーンが今も好きであるということをずっと再確認していた。

https://ncode.syosetu.com/n5606cq/

これはまずいと一旦日記を書き始めた。日記を書きつつまたYouTubeを見てしまう。

以下の動画の51分57秒からは森中花咲さんと剣持刀也さんのデュエットでトンデモワンダーズを歌っている。これが抜群に良かった。特に剣持刀也さんの歌が上手すぎて初めて聞いたときマジでひっくり返るかと思った。配信のメインじゃないけど日記だから彼だけに言及しちゃうぞ。まず冒頭ですぐプロセカバージョンのMVと似た声をしているなと感じた。それなりに高めの声でクールに歌っているのが良い。早口の歌詞にも関わらず一音一音はっきり発音されていることからも原曲のボカロっぽさを感じられてどんどん好きになっていった。

www.youtube.com

午前11時就寝。

06/10(金)

午後10時起床。たくさん眠れて偉い。しばらくYouTubeを見てから起き上がった。

昨日先生に送信したOctaveコードについて、R言語に書き直したものが研究室の先輩から送られてきていた。読んでコメントをくれとのことだったので、一念発起しR言語の環境を整えることにした。といってもUbuntuだとapt-get install r-baseするだけだったので非常に簡単。それで実行して、確かに正しく動いているのを確認。一応一か所パフォーマンス的に嬉しくなさそうなところを指摘したものの、本質的ではないなあと自分でも思う。

午後1時半からCF #798 div.2。火曜日は失敗したURL貼り付け時のタイトル表示だが、この記事を書いているときはうまくいった。一度表示できてしまえばこちらのもの。当然火曜日の分も貼り付けなおせば表示されるが、いちいちそういう対応をするのは面倒なので、これからはその時々で貼り付けた状態をそのまま放置することにした。

Dashboard - Codeforces Round #798 (Div. 2) - Codeforces

Aから微妙に難しい気がする。abで文字が共通しないので、貪欲に取るのが良い。Bは先頭から貪欲に埋めても最後の2つを入れ替えたりすればちゃんと条件を満たせる。Cは単純な木dp。Dは45度回転して各軸における座標の最大・最小を求め、その中央の近くを試せば十分。45度回転を戻したときにちゃんと範囲内になることは要チェックか。ちょっと怖いので各座標で試す範囲を\pm 5とした。実はそもそもn\times mマス全部試すのが想定解だったらしい。

Eは難しい。デクリメントがあることを完全に忘却して、まず最初の状態で連結成分を求めて、偶数をいくつか奇数にすれば全部繋げられるなと考えていた。これで1WA。デクリメントの存在を再発見し、思ったより難しいことに気づく。しばらく考えて、LSBで分類すると高々2手(ただし0\rightarrow 1を除く)でよいことが分かった。LSB最大のものをデクリメントすることで、それ未満のLSBを持つ要素全部と連結にできて、残りLSBが同じものについては一つ選んでインクリメントすれば十分。よって0手か1手で達成できるか確認するという問題になって、0手は愚直に、1手はすべての\pm 1を全探索して、連結性をO((\log\max a)^2)で判定して解いた。判定は各bitを頂点とし、要素ごとに立っているbitたちを結ぶ辺があると見たときの連結性に言い換えられ、各bitのペアについてそれを両方含むような要素が何個存在するかカウントしておくと差分更新できる。

システスも全部通って15位。

午前3時から日記を書き始めた。昨日から日記を書いている間YouTubeでNJU歌謡祭2021をずっと流していたのだが、朝方ついに完走した。後半にあるニホンノミカタはインタビューまで含めて一つの流れだったらしく、元ネタを調べて完成度の高さに笑っていた。最初にこのアーカイブを再生した時は、知っているVtuberが歌っている部分だけ飛ばし飛ばし見ていたので、こうやって全編通して見る機会を作れたのは良かったなと思った。

www.youtube.com

www.youtube.com

後半の2時間24分19秒時点、インタビューでリゼ・ヘルエスタさんとアンジュ・カトリーナさんが決めポーズについて話している部分。この後のどこかでチャリで来たポーズを決めたいねと言っていて、もしやと思って最後のVirtual to LIVEをじっくり見てみたら見事に成功させていた。3時間14分29秒時点。これだけで目を灼かれるくらい良いな。

https://www.youtube.com/watch?v=zoynMroawZw&t=8659s

https://www.youtube.com/watch?v=zoynMroawZw&t=11669s

ハーメルンを1作読み始め、そのまま最新話までたどり着いてしまった。日記を書いていたんじゃないんですか?「幼馴染がVTuber始めたら友人Aちゃんと呼ばれるようになった件」。幼馴染がVtuberを始めて、配信で話題に挙げられるためファンに認知されてしまったという設定は似たものをカクヨムでも読んだ記憶がある。僕はそういう設定が好みなのだが、これは結構一般的な感覚なのだろう。この作品もかなり好みでエタっているのが残念。

syosetu.org

しかし結局こういう設定は「人気者と特別仲が良い自分」に対する優越感が根底にありそう。その人気者の位置に今ドキ風にVtuberをメインに据えるのも、ラノベでよく見るようにアイドルをメインに据えるのも本質的には変わりないなと考えてしまった。Vtuberとアイドルの違いは自分でもできそうと思えるかどうかだと思っていて、それを押し出した作品がより良いのか。しかし演者をメインに描こうとするとすぐ炎上だったり人間関係だったりドロドロした話になってしまいがちなので、考え物。

結局そのあとも別のハーメルンを読み始めたりしてほとんど書き進められなかった。午後0時半就寝。

06/11(土)

午後4時前に冷凍弁当を受け取った。またすぐ寝て、午後8時起床。食事してYouTubeを見て、午後9時からABC255に出た。

Aising Programming Contest 2022(AtCoder Beginner Contest 255) - AtCoder

今日はA問題の問題ページを事前に開いておいたが、すぐ短くなりそうな見た目ではなかった。以降Ex問題まで全部C++で実装。Aはよい。Bはちょっと題意を把握するのに手間取った。Cはかなり難しめ。まずD=0のケースを処理し、D\lt 0D\gt 0に帰着しておく。あとはA+Di\le X\lt A+D(i+1)のような不等式を解いて高々2か所チェックする。Dは自明。

Eはそれなりに難しいものの考察がスムーズに進んでかなり素早く解けた。とりあえずA_1を固定して一つ良い数列を作っておけば、適当にずらすことですべての良い数列を考えたことになる。ずらすとA_1\leftarrow A_1+xならA_2\leftarrow A_2-xのように交互に増減することを踏まえ、各位置についてラッキーナンバーにするときに欲しいxを求めて、最も重複するものの個数を出力する。FはP_1が木の根になっていて、それのIにおける出現位置の左右で列を分割すると左右の子の部分木に関するIが得られる。このIに含まれる要素はPにおいてもまとまって出現している必要があり、その部分がIに対応するPになっているので、再帰的に解く。

Gは実装がつらい。考察を進めると、Grundy数は大体連番になっていて、石の数がどれかのXに一致するところだけたまに変な値が出現して全体が後ろにずれるとわかる。よって全体のGrundy数は連番となっている区間に分割することでO(M)個の情報で保持できる。Grundy数のカウントを連番と変な値に分け、連番の分仮想的にカウントが+1されていると見なせば、実際にXに対応するGrundy数を求めるのはmapで行える。Exは座圧して区間ごとに含まれるインデックスの和を持っておくことで遅延セグ木に乗る。実が増えるのはインデックスの和の係数に対する区間加算になって、収穫は値のセット。Nの制約が大きいことに気づかず、最初長さNの遅延セグ木を作ろうとしていた。

全完。Gのしょうもないミスで1WAし、順位は6位になった。

コードゴルフ。Aは冷静になるとdcで素直に書ける。コンテスト開始から1時間以上経ってようやく気付いたものの、ちゃんと開始すぐに同じコードを書かれた方がいて負け。BはRubyで、複素数abs。Cは謎。とりあえず自分の解法をRakuで実装しておいた。Dみたいな大量に二分探索を行う問題はOctavelookupが強い。最近活躍する機会があまりなかったので、久しぶりに使えて気持ちいい。EはPerl。インデックスの偶奇を得るため特殊変数$|を用いているが、ゼロクリアしていないのでNが奇数のとき正しくない挙動をするはず。なのに通った。よくわからない。以降は手付かず。

今日のABC255もリアルタイムで実況しつつ参加していた。この録画の編集を日付が変わったあたりから始めた。発言がない部分を切り詰めるという編集スタイルを知ったので、今回はそれを試してみたい。

AviUtlに動画を読み込み少しカットしたところ、音ズレが発生してしまった。調べるとフレームレートが固定か可変かの違いによるものらしい。僕が使っているキャプチャソフトShadowPlayは可変フレームレートでしか録画できず、一方AviUtlは固定フレームレートにしか対応していないようだ。AviUtlの入力プラグインの設定を弄って再度読み込んでも変わらなかったので、動画自体を固定フレームレートにエンコードしなおすことにした。

HandBrakeというソフトをインストールして、実行。これにもしばらく時間がかかった。しかも出来上がったファイルをAviUtlに読み込ませると例外が発生してしまう。入力プラグインL-SMASH Worksを優先的に使うようにして何とか解決。しかし今度は一部の操作が異常に重くなった。先ほどのエンコードでは元のファイル2.2GBから出来上がったファイルが600MBほどで、つまり圧縮されてしまったのが問題らしい。調べると無圧縮に変換するとよいと書いてあったものの、やり方がよくわからなかったので、操作の重さに耐えつつ編集を進めることにした。

幸い動画の一部を削除するのが激重なだけで、動画の一部を別のところに移動させるのは大丈夫だったので、それを多用し削除を保留するような形で編集を進めた。先ほど述べたような編集スタイルでは大量のカットが発生するので、このことに気づかなければ待ち時間が長すぎて途中で心が折れていただろう。無言かつ画面に動きがない部分をチマチマカットし続けて何とか最後までたどり着いた。この時午前7時。本当は重要でないシーンもばっさりカットするべきだったのだろうけど、考察シーンもコーディングシーンも全部動画に残したかったので、元70分弱だった動画は結局50分強になった。このあたりゆっくり実況なら倍速をかけていたのだろうが、一応喋りながらコーディングしていたし……。

適当にBGMを設定して完成。この状態でチェックする気力がないのでとりあえず出力する。カットした部分の処理に時間がかかるようで、これには80分ほどかかった。その間はまたYouTubeを見ていた。途中でBGMをフェードアウトさせる設定を忘れたことに気づいて絶望。もう何もかも面倒になって修正しないことを決定。次に、出力された動画を再生しておかしなところがないかチェック。これは主に音だけ聞きたかったので、日記を書きながら流しておいた。

全部完了して午前10時に投稿。序盤のサクサク解いている部分だけなら結構見てもらえるのではないかと思う。全部通して見る物好きがいるかというと……毎週2万文字くらい投稿される週記を読んでくれている人がいるように、50分僕がボソボソ喋っている動画を見てくれる人も誰かいるだろう。そう、ちゃんとマイクに向かって発言することを意識しないとすぐボソボソ不明瞭な話し方になるのは改善すべきところだった。しかしそもそも生声実況の編集は音ズレなどの問題でかなり面倒であることに気づいてしまったので、今度動画を作るときはまたゆっくり実況に戻るかもしれない。

www.youtube.com

合間に昨日から読んでいたハーメルンを1作読了。「24歳、男性。Vtuberを始めるも、女性ファンより男性ファンが多い件について。」。あまり設定が好きではないのにVtuberモノだからと何となく読み始めたら思ったより重い話が多くて、全体的に辛かった。

syosetu.org

さらにいくらか日記を書いて、午前11時半就寝。

06/12(日)

午後4時半起床。午後5時からOpenCupの代理コンテストがあるので、それまでに食事をしたい。冷凍弁当をレンチンしつつ合間の時間で機械学習のコードを書き換え実行しようしたら、案外時間がかかって弁当を食べる前にコンテストの開始時刻になってしまった。結局コンテスト中に食べた。

今日のコンテストタイトルはPKU Contest 2, PTZ Summer 2021 Day 5。今日はチームメイト一人が参加できないらしく、二人だった。思い返せばこれまで一年近く、みんな毎週参加していたのが偉すぎる気もする。結果はAEGCDの5完だった。コンテストリンクを貼っておいて、問題に対する言及は解法だけにしておこう。どういう問題だったかは以下のリンク先を参照してほしい。

https://www.acmicpc.net/category/detail/2800

Aはどんな操作でもコストが一意。Eは部分長方形の行を決め打ち、数列に関する問題に帰着する。そうすると最大値を削除して区間をマージするのを繰り返すことでソートを除き線形で解けるため、全体でO(n^2m\log m)になる。うっかり数列に帰着する部分でO(nm)かけてしまい1ペナ。さすがに頭が回ってなさすぎる。次にチームメイトによってGが通された。

Cはn=1の場合を除いておけば、(円状に並べて)隣接する値が一致する確率を独立に求めて足し合わせることで答えになる。ここで、sの長さaについて、f(s)=1\dots aのそれぞれの値を取る確率を考える。sの周期が重要になって、aの約数を昇順にd_1,\dots,d_kとおくと、f(s)=1\dots d_1の確率はそれぞれ同じ、f(s)=d_1+1\dots d_2の確率はそれぞれ同じ、……となるようだ。よって、隣接するa_ia_{i+1}の約数を列挙しマージすることで、各値を取る確率が同じになる区間に分けて計算すればよい。この制約のもとk\le 128なので間に合う。

DのLを固定する方針だけ立てて、考察の後半と実装はチームメイトにやってもらった。定数倍に大変苦しまれている間BとFを考えて、どちらもそれっぽい解法を考えたものの正当性がわからない。残り30分でDが通ったのでBに特攻し、3ペナほど吐いて終了した。

コンテスト後にFを実装したら20分で書いたコードが一発で通った。こちらに進んでいれば完数を増やせていたらしい。aが零行列になるまで、一番上の非ゼロの行を消し、残っている中で一番左の非ゼロの列も消す。これで一つ\vec b\vec cのペアが決定する。この操作を繰り返して、aが零行列になる前にKが足りなくなったらダメ。逆に余った場合、二個ずつ組にしてb_1=1c_1=\pm 1を入れる。一つ残った場合は直前の組を少しずらして、それを打ち消すようなものを入れるのが良い。基本的にどの要素も\pm 1のどちらかを選べばまた非ゼロ要素にできるので可能。基本的にと言ったので、そうでない場合をいくつか場合分けする。

まず、簡単なものとして「直前」がない場合、つまりK=1かつaが最初から零行列だった場合。これは当然不可能。次に、p=2の場合はずらすと\vec 0になる可能性がある。具体的には、\vec bまたは\vec cのどの要素を選んで\pm 1しても操作後に\vec 0になってしまう場合。0\rightarrow 1ができることに注意すれば、このようなケースはp=2に加えn=m=1を満たすとわかる。この場合は最初にa_{1,1}パリティKパリティを比較して処理しておくのが良い。

解説をいくつか読んだ。Bの\bmod{p+q}で考えるという考察は見覚えがある。見るたびあまりの天才性にひっくり返っている。これこのコンテストで5番目に解かれている問題ってどういうことなんだ。IのN=6のケースはヒューリスティックに求めよと書いてあってげんなり。大きなケースのヒントではなかったらしい。そういう優しさのあるコンテストではなかったか。一方N=20のケースの構築方法はこれまた天才的だった。そもそもオートマトンである文字列が受理されないとは、遷移後に終了状態にないということであって、決して途中で遷移先がなくなったということではない。このことを勘違いしていた。

少しYouTubeを見た。実はカバンチェックがあるというのは事前に言われていたらしい。そういう企画はオモコロで見覚えがあるし、最後に謎の格言を大声で喋っているのもオモコロっぽい。面白いのでOK。確かにVtuberの演者のリアルに繋がることは徹底的に排除されるべきだから、予告なしのカバンチェックなどタブー中のタブー。

www.youtube.com

午後11時半からECR130。

Dashboard - Educational Codeforces Round 130 (Rated for Div. 2) - Codeforces

Aはやるだけ。Bは大きいほうからx-y+1\dots x番目の和なので、ソートして累積和。Cは'a''c'の相対的な順序が固定されていて、間を'b'が動くと見なせる。しかし'b'だけ抜き出したりするような実装が面倒だったので、普通に先頭から合わせていった。まだ使っていない最も前にある文字を正しい位置に持ってこれるかチェックする。操作の順序は答えには影響しないはず。

Dは先頭から見て、まずその位置の文字がこれまでに出現したか判定する。出現していない場合はクエリ1で特定。出現している場合は、どの位置まで区間を広げれば今見ている位置の文字が出現するか二分探索する。普通にやると\lceil\log_2 n\rceil回かかるが、これまで出現した各文字の最も右に位置するインデックスを集めてソートしそれだけ見ることで\lceil\log_2 26\rceil=5回になる。最初の判定と合わせてクエリ2は高々6n回で、ギリギリ制限を満たす。二分探索の条件で頭を壊してしまい1WA。

Eはかなり迷走した。同じ色で塗れる点の集合、特にサイズが2以上のものを考える。まず、同じ集合に属する点は互いに最も近い距離にある必要がある。さらに、逆に各点について最も近い距離にある点が全部その集合に入っていなければならない。以上のことから、それらの集合を全通り集めてきたとき、どの二つも共通部分を持たない。それぞれの集合について全部同じ色にするか全部バラバラの色にするかの二択になり、これを遷移として使った色数を持つdpが書ける。どの色とも同じ色で塗れない点は先に処理しておく。最後に、色数に応じてどの色を使うかの場合の数を掛けて答えになる。

Fは解けず、23位。open hacking phaseが終わっていないので暫定的な結果。Dの最初の判定も二分探索に含めることで、クエリ2を高々\lceil\log_2 27\rceil n=5n回におさえられそう。Eのdpは謎の次元を増やしてしまい計算量が悪い。これはn\le 100という制約に助けられた。さらにtypoでうまく\bmodを取れていないが、こちらはギリギリ大丈夫そう。Fは2-SATらしい。

ネット小説の更新を漁っていたら午前4時になってしまった。溜めていた日記を書き始める。相変わらずYouTubeに気を取られつつ午前10時までかかってこの位置まで書き進めた。

Vtuberにハマってから明らかにPC作業の集中力が落ちている。もともと昔から作業用BGMのため常にバックグラウンドでYouTubeを開いていて、一年ほど前にモニターが5枚に増えてからは一画面をYouTubeに使うようになって常に動画が見える状態だった。これまでは曲のPVや一枚絵が表示されているだけだったそこに、今はVtuberが四六時中映っている。やるべきことに手を付けられないことを除けば、今の環境はまあ、幸せである。

一瞬外出。生協でパンやお菓子と注文していたラノベを購入して帰宅。

書いた日記を推敲していたが、問題の解法を説明する文章がどうにもうまく書けず苦しんだ。特に自然な言い方にはなっていないし、かといって曖昧さを排除できているわけでもない、中途半端な形である。ほどほどに諦めをつけ、正午を過ぎてようやく完成。