むかでのチラ裏

競技プログラミング現役引退でチラ裏に・・・

週記(2021/08/23-2021/08/29)

7 月末から 8 月頭にかけて,ワクチンの副反応に苦しんだり忙しかったりして週記を書くのをやめていた. ようやく元の生活リズムに戻りつつあるので,これを機にまたつけようと思う.

最近の変化を言うと,健康のためにリングフィットアドベンチャーを始めたことが一番大きい. リングフィットアドベンチャーをした後,シャワーを浴びて寝ると言うのが完全に健康そのものなのだ. しかし,これには一つ問題点があって,Codeforces のコンテストと疎遠になりつつある. Codeforces に復帰するタイミングを完全に逸してしまっている.できれば今週の VK Cup Final の Div.1 から復帰したいな.

あとはできるだけ外出を減らしてピアノ鍵盤をしばく時間が増えた. 発表が迫っているのに全然上手くならないため,単純に焦っている. 長らく基礎練習とかもサボり気味だったため,久々にしっかりしばく日々に戻ったら腕が痛くて狂っていた

08/23 (MON)

7:45 起床.世間は夏休みが終わったり終わらなかったりしているが,今日は大学に行く. というか普通にお盆周り以外の平日は普通に研究をしているため,もう正直夏休みとかどうでもいい.

行きの電車では昨日の D - Unique Subsequence の解法を再考していた. 昨日のコンテストの後,BEMANI PRO LEAGUEアーカイブを見ながら 「もらう DP をすればセグ木で高速化できそう」と思って書いたら通った. しかし,コンテスト中は配る DP に終始しており,この方向でも解けないか考えていた. やりたい DP テーブルの更新が区間内の同じ数字の中で最左にある要素(のインデックス)」に加算を行いたい (詳しく書くと長そうなのでこの問題を一つの記事にしようかな…). 遅延セグ木でまとめて加算を行ってしまうと最左以外にも加算を行ってしまう事になる. 悩んでいたが,現在着目している要素と同じ数字が次に現れるところの DP の値を 0 クリアしてから配ると良いかも. なんにせよ,あまり見ないタイプのセグ木高速化 DP だったので復習しておきたい.

大学について,モンスターエナジーを購入して気合を入れてから作業を開始する.

前に週記を書いていた時も思ったのだが,大学にいて作業している時間については書きにくいため,困る. いや殆ど生活の記録のためにつけているため退屈な内容でもいいのだがあまり読み返す気がなくなるのもどうなのかと思ってしまう.

今日は昼にケイジャンビーフチーズステーキサンド食べた. 毎週毎週ライスの方を食べていたので,月曜のキッチンカーのメニューを制覇しようと思ったので軽く変えてみた. 思ったより凄まじい見た目をしていたので写真を撮った.

f:id:spider_0859:20210825231734j:plain:w300
ケイジャンビーフステーキサンド.見た目が凄まじい.

17:00 ぐらいに大学を出る.最近ゲームをしていなかったのでゲームセンターに行くことにする. 最近やっていないだけあって全然上手くなくてちょっとしょげたが,色々なゲームを久々にやってかなり満足した. そのまま大学の近くで夕食を食べた. 元気ぼうやなので夕食の後も音ゲーをした.

帰ると 22:30 を回っていた.最近はピアノもよく弾いているので腕が強くなっているかと思いきや,普通に音ゲーで疲れてしまった. どうやら,音ゲー筋とピアノ筋は違うらしい. 疲れたので汗を流してそのまま就寝した.ARC D の別実装は明日以降に回そう…

08/24 (TUE)

8:30 起床.今日は大学に行かないので多少ゆっくりしたスタートだ. なんやかや朝の支度をして作業を開始する.

そういえば最近,使うエディタを VSCode から vim に変えた. というのも,サーバに接続してリモートのファイルを VSCode で編集するとかライブラリのスニペットが怠いとかもう正直うんざりだったのだ. Windows 育ちで GUI呪いのように身体に死についてしまってしまっている自分ですら そう感じるのだから,世間の人はもっとこれを感じるだろうと思う. まあ,大きなプロジェクトみたいなものを弄るときは GUI の方が良いこともある気がするので棲み分けが必要なのかもしれない.

あと長らく一部のマウスイベントがアプリケーションに伝播しないという理由から tmux を敬遠してきたのだが,まあもう普通に面倒臭いので入れることにした. 普通に便利だった.マウスイベントとかもうどうでもよくなった.GUI の呪縛から解き放たれつつあって嬉しい.

ついでと言っては何だが,これに伴って競技プログラミングの環境も完全に WSL に移行した. 元々使っていた WSL 環境が WSL 1 を使っていた. WSL 1 は,厳密には Linux カーネルが動いているわけではない.Linuxシステムコールを受け取って Windowsシステムコールに変換して それを実際に Windows くんが実行しているといった代物である. そういうわけで,ちょいちょい動かないことがあったりした. また,システムコール変換とかをしているためか,ディスクアクセスが異常に遅いのが困りものだった. WSL 2 では本当に Linux カーネルが動くので安心だ.

まあ WSL 2 に切り替えればいいだけなので,切り替えた.ディスクアクセスが速くなって感動した. ディスクアクセスが遅いせいで存在しないコマンドをタイポで入力したときに悠久の時を待たされることが無くなった. fzf コマンドと連携する vimプラグインがあるのでちょっとカスタマイズしてあいまい検索でライブラリを貼り付けすることが出来るようにした. 普通に前より快適で大満足している.今迷っているのが WSL 環境に補完プラグインを入れるかどうかである. 競技プログラミング文脈ではあまり必要に見えないがどうだろうか. AtCoder Library の引数とかが見られたり,uniform_int_distribution とかを補完してくれるのが嬉しいだろうか.

f:id:spider_0859:20210825233319p:plain:w300
現在の競プロの環境.割と満足している.

別に環境整備の作業をしていたわけではないが,作業を終える. 本来は 18:15 まで作業をするのだが,最近は早く上がってピンチなピアノをしばいている.

夕食までずっとピアノを弾く,8 小節ぐらいを時間単位で弾き続けると流石に狂える. 最近は暑いのも相まってうっかり死にそうになっている. 連日で弾いているので腕の筋肉痛が取れないまま再び練習をしていて苦しい.

夕食を食べる. 今日は Codeforces があるが,結局久々でいきなり Div.1 を出る勇気が出なかった. 代わりに MIB 3 を録画してあったので見た. 実は 1 と 2 は既に最近見た.まあシリーズ全て見たことがあったので見返しだったのだが,内容をある程度覚えていても十二分に楽しめるいい作品だ.単純な SF ではなく笑いどころもあるのがとても好みに合っている.

シリーズの 4 作目が出てほしいという気持ちはあるのだが,シリーズが大分 3 作で綺麗にまとまっているのと,単純にトミー・リー・ジョーンズがもうだいぶお爺ちゃんなのとで厳しさを感じている.

夜は寝た.夜は寝る時間なので.Codeforces やっていた頃の自分が信じられない.

08/25 (WED)

9:00 起床.特に時間的拘束がある日ではなかったので自室でまったりしてから,朝食を食べた. 朝食はハムとチーズとトーストにバターを塗って食べた. 世の朝食で最もシンプルでうまいものはバタートーストだと思っている.

一応今日もオンラインでのミーティングがあったため,報告するためのものを見つけたり開いておく準備などしていた. あとは漫画とか読んでいた気がする. 最近は特に新しい漫画を読み始めたりはしていないはずなのに漫画読み返している. 面白い漫画があったら賜りたいが,これ以上追うものを増やしたら終わりそうなので完結しているものを賜りたい.

昼食は親子丼を食べた.美味. 昼食を食べ終えると本日の拷問の時間だ.連日で腕を酷使したせいで今日も腕が重い. 思い切って今日は軽い部分練習のみを一通りこなすことにした. それに今日はピアノ教室に行く日なので疲労困憊で行っても先生が困惑してしまう.

最近はちゃんと練習時間を無理やり創出しているため,教室で惨めな気持ちになることは減った. ただ単純に研究とピアノと少々の漫画 or 競プロだけで一日が終わる日々はなかなか来るものがあるので, 9 月のピンチを抜けたら一旦生活を見直そうと思う.

教室から帰るとミーティングが待っている. 正常に動いたはずの pythonスクリプトがなぜか壊れていてムカつく. 黙って正しいグラフを生成していてほしいな.

ミーティングも終わると,少し夕食まで時間がある. 普段なら時間から結局ピアノを弾くのだが,今日は腕を休ませることに自分の全細胞が同意していたのでやめておくことにした. 代わりにコンビニに行って切らしていたケチャップと自分が飲む酒とつまみなどを購入するなどしていた.

夕食を食べると一気に眠気に襲われた. 父親が iPhone に CD の音源を入れたいというので色々見ていたが,普通にこういうのが一番難しいと思った. 情報工学専攻の人間でもこういう「アプリケーションの操作」みたいなことが全然できない.カンも悪い. いや,コンピュータに詳しい人が使えないようなインターフェースを作ったやつが悪いに決まっている.許さん.

またフリーの時間が訪れた. 暇なのでここで週記の更新を行う. これを書いている途中に先週の ARC D の別実装を書こうとしていたのを思い出す. 遅延セグ木(双対セグ木)を使った配る DP 解法で通しておいた.

Submission #25335428 - AtCoder Regular Contest 125

配る方が直感的に感じるけど,少なくともセグ木高速化の時は貰う DP を採用した方が無難そうだ.

08/26 (THU)

9:10 起床.自宅作業のためギリギリまでゴロゴロできるとはいえ,ギリギリを攻めすぎた. 普段なら大学に行く曜日にしているが,最近はピアノを弾くためだけに自宅にいる日を増やしている. 作業自体は大学にいる方がいい気がするし,家にいると単純に人間と関わらないので寂しい.

今日は作業と練習を終えたら sak さんのアルゴ式でも始めようかと思いながら作業開始. 本日はなかなか VPN に接続できなくてイライラした.

本日も作業を早めに終えて,拷問腕いじめタイム開始. 先日流したのが功を奏したのか腕の重さがなくなっていつもよりいい感じに弾けた気がする. ただし,三週後ぐらいには完成していなければならないと思うと絶望しかない.

夕食.おじいちゃんなので何を食べたのかは忘れました. このあとうっかり YouTube を開きながらベッドに横になっていると,気づいたら 23:45 になっていました… さようなら僕の Div.2 … 寝汗をかいていたので諦めてシャワーだけ浴びて寝た.

08/27 (FRI)

11:30 起床.寝坊しました.まあ今日は休みの日で,兄と近場で遊ぶ予定だったのでよかった. 昼飯を食って外出する.まあ遊ぶと言ってもゲームセンターに行くだけなんだけど… カラオケとか兄と行くのはちょっと嫌だしな.

ゲームセンターに向かう. 近場で SOUND VOLTEX の新筐体が置いてあるゲームセンターが一つしかないので必然的にそこに行くことになる.

最近完全にボルテサボり気味だったのでしっかりやることにした. 色々やっていたら,徐々に戻ってきて最高難易度もボチボチ押せていたので良しとした. あとは pop'n music をプレイした. 自分の地元では全然このゲームが人気ないため有難く連呼させていただいている.

本日の具体的なリザルトは大体下のような感じ.ポップンのリハビリ中かなりつらいな.

f:id:spider_0859:20210829122312j:plain:w250f:id:spider_0859:20210829122322j:plain:w250
本日のリザルト.ボルテは惜しく,ポップンはしっかり押し負けている.

今日は遊んで疲れたから拷問はいいかなと一瞬思ったが, ピアノの神様がいたら相当なケチ野郎で一日でも弾かないとゲボほど下手くそになるので 泣きながら夕食まで弾いた.

夕食後,今日は yukicoder 311 があるので出ようと思う.前回はうっかり酒を入れたが今週は入ってない.頑張る.

A: 指示に従って算数をする問題でした.

B: $ [L,R] $ 内に含まれる整数 $ A,B (A \leq B) $ で連続和が素数のものを数える問題. 立式してみると $ A+B \leq 2 $ か $ B-A+1 \leq 2 $ が自明で精査すると,$ A=B, A=B-1 $ しかないので 単純に区間素数カウントをすれば良いことになる.篩で十分.

C: ゲロムズで困った.最初の $ N-2 $ 個を $ 1 $ にすることで実質 $ 2 $ 個の問題になり,解けてハッピー. 自由度が高すぎる問題は初手適当に固定してみるのが手か. $ 1 $ は分母のみ $ +1 $ という変わった性質を持っているので,試さないのは怠慢という見方もあるか…?

D: 雰囲気がガラっと変わってスタンダードな問題.最初 $ 1 $ を $ K $ 個あって,各素因数ごとの 配り方を重複組み合わせで求めて掛け合わせる. ただしいつもの二項係数ライブラリではだめで,$ \binom{N}{M} $ の計算が $ O(M) $ になるような手法を用いる.

E: 零冪行列とか調べていた.コンテスト後,急に隣接行列に見えたら最長パスの問題だと気づきうつ病に…

F: B の制約強化版.yosupo judge を知っていたので本当に貼るだけだった.ありがとう…

コンテスト順位は 33 位.E でポカをしていることを考えるともうちょっと上を狙えてしかるべきコンテストだったな. というか $ 0,1 $ だけで大きめの行列とかいうの,隣接行列を疑えよ…と過去の自分に言いたい. 累乗とかいうのも誘導ポイントなのにアンテナがヘタっているとしか思えない.

08/28 (SAT)

8:30 起床.朝から WSL 2 のディストリビューションUbuntu 20.04 LTS にするなど,パソコンをいじり倒していた. なんか全然うまくいかないため朝食を食べないまま昼食の時間になってしまった. なぜだか知らないんだけど今まで Ubuntu 16.04 LTS を使っていたんだけど,これはなぜだろう. 多分だけど WSL 1 のせいな気がする. ただしこれのせいで色々なソフトウェアが入らず,色々やっている内になんか環境がぶち壊れたのでもうあきらめた.

具体的には C++ の補完のために clangd を入れようとしたら,もうめちゃくちゃになった. clangd とは,いわゆる Language Server で常駐してソースを解析して IDE とかのリクエストに応じて情報をくれるプログラムだ. こいつが裏で動いていることによって補完したり,関数の定義元に行ったり,引数をポップアップで見られたりするわけだ. vim 全然詳しくないので最近先輩に教えてもらったのだが,vim 側のクライアントのプラグインとして coc.nvim というのがある. 使ってみると普通に便利だ.競プロに補完なんて必要ないと思ったけど,自分のライブラリの命名とか引数とかよく忘れるので実はありがたい. ただ clangd という名前の通り,Clang の C++ を解析するヤツなので GCC 独自仕様については注意してほしい. 競技的には #include <bits/stdc++> がその最たる例だと思う. 当然これを平気で書くと怒られるので, https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/precompiled/stdc%2B%2B.h とかから stdc++.h を落としてきて適当な位置 (今回は /usr/local/bin/bits とするか) に置いて競技ディレクトリのルートに

[compile_flags.txt]

-I/usr/local/bin

をブチ込めば多分大丈夫なはず.正直競技で使いそうなものだけ #include するお手製の stdc++.h を用意するのも良い気がする.

一般的な(広義)プログラマーはこのぐらい知ってそうで長々とウザいと思うが,競技er はなんか知らなそうなのでこの週記に書き起こしておく意味があると信じている.WSL で完璧な競技環境を整えたらブログのエントリーにしたさがある.

マジで気づいたら夕食の時間になっていた.土日だけ時空が歪んでいる. 今日は CodeChef があるらしいが Codeforces も復帰できていないのに Chef に出る元気は出てこないかな.

夕食後,21:00 から BEMANI PRO LEAGUE がある.土曜日のこの時間は ABC が入りがちでなかなか生で見られなかったが今週はなかったので生で見ることができた. 音ゲー大好きボーイなので,最高のコンテンツとなっている. 今回の試合だと SUPER NOVA Tohoku を応援している. 判定厳しめのゲームは当日のコンディションでいとも簡単に BAD でハマったり黄ばみまくるから恐ろしいなと思うなどした.

試合の鑑賞後は WSL 環境のログインシェルを bash から zsh にしたので zsh について調べていたが,情報量が多すぎて混乱していた. 長らく Windows 環境でわちゃわちゃしていたこともあってここら辺のツールの知識がまったくないことに危機感を最近覚え始めている.

08/29 (SUN)

7:30 起床からの 9:30 起床からの 11:30 起床.記憶は曖昧だが 5:30 にも目が覚めていた気がする.病気か?

朝食を食べて週記の編集をしながら漫画アプリの無料ポイントを貪る作業をしていると,マンガワンという小学館のアプリで 無料ポイントが得られないことを確認した. ついにこのアプリは無料ポイントをくれなくなったかと思ったが,よく見たら今日は一大イベントで多くのタイトルが全部無料になる日なのだそうだ.最高かよ.この機会に読もうと思っていたタイトルを読み漁ろうと思った.こんなことならもっとちゃんとタイトルを調べておくんだった…

あと,Ubuntu 20.04 LTS 向けの環境を作ったので設定ファイルなどを全て GitHub に push しておいた. 試しに一か所これで構築したらかなり気持ちよくなれた.もう一か所やろうと思ったら,RedHat だったのでちょっと手を加える必要があった.

さて今日は ABC があるので出ていくぜ.

AtCoder Beginner Contest 216 - AtCoder

A: 言われた通りに判断を下します.譜面定数らしくて草.

B: 文字列のペアの Unique チェック.set でもなんでも.

C: $ +1 $ と $ \times 2 $ を使って $ 10^{18} $ 以下の数字を $ 120 $ 回いないに構築する問題.これは二分累乗法みたいにやるだけ.

D: シリンダーの中の上から同じ色のボールのペアのみを取り出せて,全て取れるか判定する問題.ちょっと悩む.しかしよく考えたら $ 1 \rightarrow 2 $ と $ 2 \rightarrow 1 $ みたいなのが存在したら不可能だと気づいた.というかまあ DAG かどうかですね.よってサイクル検出をすればよし.

E: 乗る度に楽しさが $ -1 $ されるアトラクションが $ N $ 個あって $ K $ 回までアトラクションに乗れる時の,乗ったアトラクションの楽しさの総和を最大化する問題.普通に上から貪欲が最適なのだが,愚直シミュレーションだと間に合わないので,最後に乗るアトラクションのその時点での楽しさを $ X $ として二分探索すると高速化できて嬉しい.愚直シミュレーションの高速化としての二分探索,忘れがち.

F: こういうのは max の方を固定して考えて,それ以下の値のみを選んだり選ばなかったりすればいいってジイちゃんが言っていた. というわけで $ A $ の昇順にソートして制約を見たら解けていた.今までの F が難しかったのでまごまごしていた.

G: データ構造を必死に使った貪欲が見えるも,非想定っぽくて嫌なので粘着していたら落とした.最悪や.

H: 解けるの?これw

G はコンテスト後に牛ゲーと聞いてウケていた.僕にはコンテスト終了直前にはフローに見え始めてオワってました. これが Rated だったら G を必死に貪欲で書いていたに違いないので,やる気が足りないな.

そんなこんなで今週の週記を締めようと思う.来週からもちゃんと書きたいと思います.