/ 最近 .rdf 追記 設定 本棚

脳log[2023-01-06~]



2023年01月06日 (金) [AtCoder] 精進。以前埋めきれなかった古い ABC から。ABC054-D「Mixing Experiment」(ぎりぎり青 diff)。以前書いた。「半分全列挙の問題が半分全列挙だと教えられる前に解けたためしがない」。それも今日で終わり。提出 #37756034 (AC / 562 Byte / 62 ms)。■Ruby によるすべての提出を見てるんだけど、別に半分にする必要はないっぽい? 無駄半分無意味全列挙? 速い提出を見ると A 過剰と B 過剰に分類してからそれぞれで組み合わせている。アイディアは近い、でもそっちの方がかしこーい、と思ったんだけど、全部が一方に偏っているときに組み合わせがやばそうなので機械的に半分にする方がいいかな。もっとも、N<=40 なので N^3 でもやばくはないし、なんならすべての和が分布する 400×400 の平面上の格子点をしらみつぶしに調べても良かったらしいけど。他には a*Mb-b*Ma という式を複数の速い提出で見かけた。比例式のような外積のような? 実行前のオーバーヘッドが Ruby 2.7 より小さい Ruby 2.3 であることを差し引いても 12 ms や 27 ms は速いのでは。■提出 #37756578 (AC / 416 Byte / 60 ms)。テキトーにさっきの式をパクってみたらそれでも AC になった。式の意味がわからない。じゃあ最初の提出では何をやっていたかというと、a と b のペアから MA 対 MB の比率ですでに完成した物質 C を取り除いたときに a と b がそれぞれどれだけ過剰かを1つの値にエンコードして DP のキーにしていた。そのキーを例の謎の式にすると a と b の値をデコードする必要がなくなってエンコードした値そのもので演算ができるらしい。謎。


2023年01月05日 (木) グラビア(凹版)印刷は、通常のオフセット(平版)印刷に比べて「溝の深さの分だけインクが厚く盛れる」ため、力強い発色が可能になる一方、版の製作にコストが掛かるため、現在は後者が主流。 なお、インクの厚盛を偽造防止に活かしたのが紙幣であり、現在、真のグラビアモデルは「樋口一葉」。 https://t.co/SBRrKXk6JP」■当たり前のことなんだけど一度も知らないまま今まで来たのでもはや疑問が浮かぶこともなかった。グラビアって、水着のカラーページのことを指すための単語、というわけではない! 凹版(オウハンと読むらしい。ボコハンではない)というからにはなにか grave の仲間っぽい? "gravier" とか "graviar" で検索してもハズレだったので仕方なく日本語で検索したら、正解は gravure だった。グラヴュア? このページ「Gravure Definition & Meaning - Merriam-Webster」に Word History も書いてある。dig とか engrave とか見えるから外してはいなさそう。■grave という単語は学校や塾では習わなかった。スターオーシャンセカンドストーリーの紋章術にそういうものがあった。「グレイヴ|敵の足元から複数の鋭い岩を出現させてダメージを与える土属性紋章術」。溝を見るか隆起を見るかは見る者によるということか。


2022年12月29日 (木) セシスルスルスレシロ。コキクルクルクレコイ。ミゼンレンヨウシュウシレンタイカテイメイレイ。忘れないことって(忘れてないから)忘れないんだなあ。カッコ書きの別バージョン(サ変の未然形とか)は覚える努力をしなかったので、忘れたわけではない。ところで、カ変の未然形は「こ(ない)」だけど、このへんでは「こぉへん」も「けぇへん」も「きぃひん」もある。ないのは「かぁへん」と「くぅへん」だけ。


2022年12月28日 (水) 今日読んでいた本に「憶病」とあって、臆病の誤変換だと思ったんだけど ATOK で明鏡国語辞典から臆病を引くと「[表記] 新聞などでは「憶病」で代用するが、慣用になじまない。」という事情があるらしい。臆が使えない字だという認識はないし、学校で習ったと思うんだけどなあ。漢字テストできっちり区別させられたと思うんだよなあ。■読んでいた本は『会話を哲学する コミュニケーションとマニピュレーション』。とても良い。マンガや小説が題材になっていて、読んだものや積んでいるものがいくつもあってとっつきがいい。タイトルのセレクトにちょっと思うところがあったのだけど、なんとなく納得できるような意外な事実が明かされたりも。全体に言葉を尽くす、言葉を蔑ろにしないという姿勢がくどいくらい徹底している。言葉が他者とのインターフェイス(のひとつ)であることを考えるとそれは他者や他者との関わりを大事にする姿勢と重なる。たぶん題材である学問分野だけが理由ではないと思う。著者のパーソナリティがだだ漏れでちょっと心配ですよ。それも本の味でとても良いのだけど。■@2023-01-04 最後まで読んだ。フィクションから現在へあざやかに繋がりました。ちょっと前にこういう本も読んだよ。『差別はたいてい悪意のない人がする』(著:キム ジヘ)、『子どもに学ぶ言葉の認知科学』(著:広瀬 友紀)。もちろん関連があると思ったから挙げた。


2022年12月25日 (日) [AtCoder] 昨日あったユニークビジョンプログラミングコンテスト2022 冬(AtCoder Beginner Contest 283)■E 問題「Don't Isolate Elements」。1行目の孤立要素を調べるでしょ、2行目の裏表が決まるでしょ、2行目の孤立要素が決まるでしょ、3行目の裏表が決まるでしょ、それでたまたま3行目に孤立要素がなくなるでしょ、そうすると1~3行目がたとえば表裏裏もしくは裏表表みたいな2択になるでしょ、そして次の4行目は3行目と同じか(表表、裏裏)、違うか(表裏、裏表)という2択になるでしょ、という繰り返しを考えるんだけど、2択2択で状態が発散してしまうのをどうやってまとめられるのかわからない。案外やってみれば行き止まりが近いし多いだろうとは思うけど、「案外」ではだめなんだよな。青 diff らしいです。■F 問題「Permutation Distance」。優先順位を付けて範囲を絞って答えを書き込んでいくことでランダムな(偏りのない、したがってぬるい)最大ケースで数十秒かかるものを書いた。(良くて) TLE なので提出はしなかった。日をおいて2次元座標で考えてみると、各要素についてマンハッタン距離で直近の点を見つける問題。そういうイメージができると使えそうなアルゴリズムがいくらでもありそうな気がしてくるけど、(ほぼ)線形時間で済ませられるものとなるとわからない。青 diff らしいです。■今日は精進日記ではありませんでした。Dead Cells をやってるよ。王の手初挑戦は生存ビルドで凍結させてからの広刃ブンブンだったのだけど、4回目の回復薬が未解禁だったのとトニックのクールダウンが2秒間に合わなかったためにあと少しを削りきれなかった。@2022-12-26 2回目の挑戦でまずは1周目クリア。あのね、バットが強すぎた。クリティカル攻撃のダメージ倍率がもともと高いうえに回転が速い。スタンもしくは移動不能というクリティカル条件を整えたうえでボコスカ殴りまくるとエリートでもあっという間に溶けていく。サブウェポンは投てき物。単体でもバカ高い威力な上にスタン効果を持つ。ポカッと先制で投げてスタンさせてから近づいてクリティカルバットでボコッと殴ると敵は死ぬ。ポカッボコッもしくはポカポカッボコッボコッでほぼ終わる。ボス戦では投てき物の「敵を倒して矢弾補充」ができないので使い慣れないウルフトラップを併用した。長すぎるエンドクレジットの謎。ロールも名前も限られた少数が10回も20回も流れている気がする。なぜ……? 大作っぽさの演出なのか BGM の尺に合わせたのか。


2022年12月17日 (土) [AtCoder] 今日は HHKBプログラミングコンテスト2022 Winter(AtCoder Beginner Contest 282)があった。嫌なことからは目をそらして F 問題「Union of Two Sets」の精進について書くよ。最大ケース(N=4000)について考えると、ジャッジから与えられる任意の区間 4000×4001÷2 通りに対してこちらは事前に提示した 50000 個以下の区間を2つまで選んでその和集合をクエリと一致させなければいけない。およそ 800 万個の区間を予め提示しておけるなら考えることは何もないけど、上限は5万個である。区間をどう分けてどう組み合わせるか。まず最初に、幅1の区間は必ず 4000 個用意しておかなければいけない。そうすると幅2の区間は幅1の区間の組み合わせですべて作れる。じゃあ次は幅3の区間を用意してみようか(3998個)。幅3の区間が揃っていれば2つ組み合わせて幅3から幅6までの区間がすべて作れる。じゃあ次は幅7の区間を用意しよう(3994個)。次は幅15(3986個)、幅31(3970個)、幅63(3938個)、幅127(3874個)、幅255(3746個)、幅511(3490個)、幅1023(2978個)、幅2047(1954個)。だいたい4万個くらいの区間を用意すれば 1 から 4094 までの区間をすべてカバーできることがわかった。■提出 #37361344 (AC / 352 Byte / 1060 ms)。キモは WM。W 関数は表現したい区間の幅に対して、組み合わせるべき区間の幅を返す。連想配列 M は W 関数によって正規化された区間幅 w に対して、区間 [1,w] が何番目に提示した区間であるかが記録してある。■D 問題「Make Bipartite 2」と E 問題「Choose Two and Eat One」の精進はまだだよ。解けてないんだからしかたないね。残念なことがあったんだよ。■C 問題「String Delimiter」はいろんな解法が考えられて他の人の提出を見るのが楽しいかもね。でも現実問題として CSV を処理しようとするとどんな実装をした場合でも完璧には処理できない狂った仕様の CSV の実在が確認されそうで怖い。提出 #37330344 (AC / 83 Byte / 155 ms)。引用符で分割して奇数番目と偶数番目で処理を分ける、たぶんオーソドックスな方法。入力と出力で文字列長が変わらないことを考えると富豪的ではあるかも。スクリプトだから気軽に split とかやっちゃったけど。■D 問題。こちらのツイート「D dfsで各連結部分の色を塗りわける。色が塗り分けられないときは0。そうでない場合、ある連結成分については「異なる色の個数の積 - 辺の個数」、異なる連結成分通しは無条件で塗ってOK。辺を重複して数えないように注意。」を読む限り考察は完了していたと思う。提出 #37345235 (WA×20)。デバッグするだけだと思ったから E 問題へ行って、帰って来られなかったんだよね。それはそれでしかたがない。E 問題の、ああいう形の繋がり方から全域木が見えなかったことこそ問題。全域木が見えたら持つべきデータの形に頭を悩ませることもなかった。■D 問題。お風呂デバッグ完了しました! U(nite)関数において引数の2頂点のあいだに辺を張るべきところ、その根と根のあいだを辺で結んでしまっていた(と思う)。提出 #37379282 (AC / 604 Byte / 438 ms)。前々回の ABC280-F が重み付き UnionFind だったんだけど(20221203)、付随データが数値(距離)から二値(偶奇)になったから扱いが簡単になるわけではなく、むしろ距離の場合はベクトルの取り扱い方が使えるところ、0/1 の XOR では取り扱いが手探りになって頭がバグりがち。だから最初の提出ではいったん根からの距離を求めた上でその偶奇を利用するように途中から方針転換したんだけど、すでにバグっていた頭は根からの距離の計算もバグらせた。どっちでやってもバグらせたので AC 提出では当初の方針通り 0/1 の XOR を UnionFind に載せた。連結成分内の辺の数をわざわざ記録したけど、まとめて辺の総数(M)を引くのでいいらしい。■E 問題はもう種明かしを見てしまったので D 問題の UF 実装から難しい部分を取り除くだけでおしまい。提出 #37379631 (AC / 341 Byte / 296 ms)。■D 問題。頭がバグるなら BFS/DFS でやるなり頂点を倍加して普通の UnionFind をするなり(「偶数世界と奇数世界?」)、やりようがあったらしい。しかしまあ、バグる頭は足りない頭でもあるわけで。■F 問題。「FはSparse Tableを作れと書いてある」らしい。たしか蟻本でセグメント木、BIT に続けて紹介されていたのが Sparse Table だった。よくわからなかったので見なかったことにしたが。■蟻本を読み直した@風呂。セグメント木と BIT のあいだのコラムで Sparse Table が紹介されていた。こういうときに使うんだ、という強みが見えない紹介のされ方だったのであまり理解する努力をしなかったのだ。F 問題の解答を踏まえると Sparse Table のココロがわかった。BIT と比較するとメモリ消費が大きくて、ということは初期化と更新に時間がかかるということ。更新は区間幅(2べき)の和でフルビット(N)だろうか。取得に関して、BIT が対数個の要素を参照しなければいけないところ、Sparse Table は2個の参照で済む。しかしどの要素を参照するかを知るために前後の2べきを求めるのにビット長の線形時間(競プロ的には対数時間だったり「log は定数」だったりする時間)をかけると有利が消える。ビルトインの clz (count leading zeroes) が使えるとビット長の対数時間で2べきが求まったりするの? なんか上手い配置があったりするの? そんな感じで、参照に有利な条件が整っているときに強みがあるのが Sparse Table だと思いました。優先度は低いよなあ。■『ハッカーのたのしみ』を開いた。CLZ 相当の命令がある場合があるらしい。ということは __builtin_clz は「悪くて」ビット長の対数時間ということなん? 1命令のコストとかそのレベルからは「すんごく速そう」以外の感想はない。


2022年12月16日 (金) 可燃性の高い話なのでかなりぼかして言うが、昔バイト先で 「ずっと人に頼る、又は頼らざる得ない様な人は尊大で傲慢になってく。何故ならずっと感謝して頭を下げて生き続けなきゃいけないなどどうかしちゃうから、自分を守る為に"逆に"そうなる」的な話を聞いて、なんか滅茶苦茶納得した思い出がある」からの「あー、認知的不協和理論だこれ 要するに「酸っぱい葡萄」 現実を受け入れられないと、認識のほうが変化していくやつ 「人に頼らないと生きていけない」を 認められないので、 「自分は偉いから人が言うことを聞く」に認知が変化していくパターンだなこれ https://t.co/ic5dMNQgw2」■障害者がモンスター化するという文脈で聞いたことがあるお話とその説明。やるせない話であり、現在どうであるかという結果だけ(それも全体の一部だけ)を見て人間性を疑うことを戒めるものだと考える。


2022年12月13日 (火) [AtCoder] ツイッターの検索結果に Swap 解いたーというツイートが流れていて、見ると自分は過去に解いている。でも問題を見ても自分の提出を見ても解き方がわからない。ほぼ1年前の当時の日記(20220116)を読んでようやく理解した。1年前はものを考えていたし頭も回っていたらしい。高くもないピークを越えて現在は劣化中……。


2022年12月08日 (木) [AtCoder] 精進。CODE FESTIVAL 2016 qual C-D「Friction」(黄 diff)。AC じゃないよ、部分点だけ。ローカルで最大ケースが安定して 50 秒だから、ジャッジサーバーが倍速だとして 13 倍の定数倍改善で通ると思う。■まずは問題を理解する。摩擦が発生するのは列と列のあいだ。最小単位2列について考える。戦略としては右をどんどん下げていくか、左をどんどん下げていくか、どこかのレベルからは左右を交互に下げていくことで摩擦を最小にできそう。端っこを除いては摩擦面が左右にあるけど、それによって一面の都合によって下げたいけど他面の都合で下げたくないというジレンマは生じなさそう。全体を通して下げる順番を調整すればどの摩擦面にとってもベストな選択が可能。そういう調整が可能なので列を下げるか上げるかには違いがない。一貫してさえいれば、配列を反転したりしなくていいし、頭の中を決まった方向に整理したりしなくていい。■提出 #37100541 (300 点 / TLE×13)。メモ化 DP。提出総数が少ないというのはあるけど、Ruby によるすべての提出を見ても AC がない。できるはずだ。■累積和の要素数をケチったのとメモを Hash から Array に代えたら 24 秒になったけどこれは2倍の改善でありあと6倍足りない。しかも答えが一部合わないし。■答えが合った。コードテストで 10.X 秒だからやっぱりあと6倍(切り上げ)の改善が必要。■メモ配列を無理に1次元化せず2次元配列にしたら 8.2 秒になった。■演算子をケチって 7.6 秒になった。■lambda を普通のメソッドにして 6.9 秒。AC は 2 秒……。再帰じゃなくてメモ配列を埋める普通の DP にしたらどうかなあと思うけど、右を下げる遷移と左を下げる遷移をどんな感じで一列に並べてループにできるか迷う。■どうも考察が足りてないみたい。こちらの提出 #949122 (PyPy / AC / 989 ms) を Ruby に移植してみたら 4.6 秒だった>提出 #37243589 (TLE×12)。よくわからない遷移。そしてすでにミニマムなこの解答を倍以上速くすることは無理だ。Ruby の将来に期待!


2022年12月05日 (月) 隻狼(SEKIRO)クリアした! だいたい3年前(20200113)に日記に書いたあと、源の宮を探索して桜竜の直前で根気が尽きてやめてしまっていた。以前見ていたこれらの動画「【隻狼-SEKIRO-】やがて玄人になる。」「SEKIRO-隻狼-「トロフィー100&やり込み解説」」「SEKIRO(隻狼) 実況 END」を見返しているうちにまた自分でもやりたくなってきたのだった。一度終盤まで行ってるし余裕余裕とイチから始めたんだけど、やっぱりいっぱい死ぬのんな。弾きはおろかジャンプステップダッシュすら覚束なくて最初の雑魚敵に殺されたし。だけど鬼庭形部雅孝とか大忍び梟とか義父とか破戒僧とか、以前いっぱい死んだボスはさすがに体が覚えていてそんなには死ななかった(でも何度かはミスであっさり死ぬ)。今回は侍大将と七本槍と重蔵と孤影衆と蛇の目タイプの敵との戦闘が楽しめるくらいになった(それまでにいっぱい死んだ)。戦闘が楽しめるというのは、すでに何が来ても(ほぼ)対応できるのであって、テキトーに近づいてテキトーに斬りつけてみて何が返ってくるかなーと成り行きを楽しむことができる状態。それでも弾きミスだったり攻撃が被って相打ちになったり対応が難しい攻撃が一部残っていたりで退屈はしない。ミスから死までが近いんだ。ラスボスの弦一郎と一心様にも鍛えられた。前回も今回も天守での弦一郎戦は身体力と回復瓢箪に物を言わせて押し切ってきたので、一心戦の前座として出てくる最終戦で初めて動きを見極める必要に迫られた。うまくいくときはノーダメージもあったけど、2時間以上やっていて勝率は5割を超えなかった。お前前座じゃなかったのかよ。一心様1段階目はわりとハメパターンに持ち込める。攻撃を中断して律儀に弾いてくれるからだと思う。居合いに付き合う必要はない。一文字は狙い目。2段階目は刀と銃と槍の連撃をテキトーに弾きながら見切りで体幹ダメージを稼ぐ感じ(チャキチャキ)。ただし突きは連撃の最後なのでそれまでに倒れてたら見切れないよ。そういうケースがいっぱいあったんだよ。ため攻撃に付き合わないのと一文字が狙い目なのは同じ。3段階目は2段階目とほとんど同じ。追加された雷攻撃がこちらにとってはボーナスなんだけど、あまり使ってこないのと、横薙ぎの方は当ててくれないから返せないしで、そんなにうまみはなかった。3段階目までたどりついたのは全部で3回くらい。数少ないチャンスなのでおくるみ地蔵とおはぎまで使って倒した。3年前に「脳筋なので弾き一辺倒で押し切りたい」と書いた。弦一郎も一心も体幹がたまりやすいボスで体力を削ることを意識する必要がなかった。自分は弾きや防御から攻撃に転じるときに暴発しやすい流派技は常に外していたし、最後は義手忍具も外していた(鐘鬼は外さなかった)。弾き(L1)と攻撃(R1)だけで戦える、非常に満足度の高いラスボス戦だった。一心様の剣技って葦名の侍に受け継がれてるんだよね。予備動作が小さくて予測しづらいすくい上げる技は武者侍りの侍も使う(でも一心様の方が力みがなくて振りがコンパクトな気がする。完成度)。一文字や十文字は隻狼自身が修得している。だから初めて戦うけど全く知らない動きではない。胸熱だしフェアだと思う。ラスボス戦 (432 MiB!)2周目の梟 (259 MiB!)。2周目は3回目で倒せた。■2周目の弦一郎・一心は1日1時間として4、5日かかった。まだ死に足りないらしい。■2周目はね、なぜかお米ちゃんがお米を補充してくれなくてお米もお米から作るおはぎも手に入れられなかった。最初のお米を菩薩谷のババアにあげてしまってそれっきり。なんでなん。細雪(3個まで一度に持てるお米の上位版)を持ってるせいではないと思う。2周目だから傀儡の術を最初から持っていて仙峯寺のフラグ立てが狂った? 小太郎に死体漁りをさせたのが気に入らなかった?■おはぎから連想したんだけど、エリザベスの名前ってエリンギからきてるよね。全然気付かなかった。あの姿を見てエリンギだと思わなかったし、エリンギだと指摘するコメントを見てもエリザベスと関連付けられなかった。■心中の弦一郎にはまだ勝ててないんだけど心中の一心には2回目の連戦で勝てた。しずくも地蔵もお米もおはぎもなしで瓢箪だけで。2周目のラスボス戦で十分に死んでいたってことかな。一心様弱くなった説もあるな。自分が認知している変化は3つで、1つは突き一辺倒だった危険攻撃に下段を混ぜてきたこと。2つ目は不死斬りを使った攻撃の追加。3つ目は共通の下段攻撃から始まる連続攻撃で派生が2種類あるものの追加。追加された不死斬りも連続攻撃も大技過ぎて必ず対処を要求してくる。対処できるし、対処するし、そのとき攻撃チャンスが生じている。■@2023-01-23 3周目の梟は2回目で、3周目の義父は1回目で倒せた。3周目の梟 (249 MiB!)。なんだかんだ対処できるという気易さがあるせいでこれまでで一番テキトーなムーブになっている。弦一郎戦についてひとつわかったことがあって、防御されようが弾かれようが斬り続けていくことで多くの攻撃を潰せる、ということ。スーパーアーマーの時だけ手を休めて対処する。順番のせいもあるけどやっぱり一心様より弦一郎の方に多く殺されている。巷で言われているより強いよ、弦一郎は。一心様の呼吸がだいぶわかってきたのか、3周目は2周目より死ななかった。こちらの行動次第で対処しにくい下段に派生させないようにできるし、逆にこちらが対処しやすい突き攻撃を待つこともできるので、うまく走り回ればまあまあ勝てる、何日目かには。3周目の弦一郎・一心 (313 MiB!)


2022年12月04日 (日) [AtCoder] 精進1。CODE FESTIVAL 2016 qual B-C「Gr-idian MST」(青 diff)。1辺が 10 万のグリッドだから辺に沿った処理は通るけど (辺×辺) の処理は通らない。UnionFind のような具体的個別的な処理ではなく、何か規則に沿って処理をまとめなければいけない。まず、造る道路の数は頂点数マイナス1に決まっている。最も低コストな道路はそれが縦であれ横であれ造れるだけ造らないという選択肢がない。では2番目3番目のコストの道路は……。提出 #37039797 (AC / 167 Byte / 173 ms)。あるコストで造れる行方向(列方向)の道路を1通り造ったら、行に対しては列、列に対しては行方向の道路を造る際の必要数が1つ減る。その繰り返し。■精進2。同-D「Greedy customers」(青 diff)。まず単純なケースとして列が昇順の場合と降順の場合を考えた。降順の場合、後ろの人を狙って物を買わせることはできない。昇順の場合はできるけど、いずれ前の人が邪魔になる。先頭の人の所持金を1刻みで残金1まで毟り取れることは決まっているしそうしない理由もない。先頭の人から順番に狙い撃ちにするので良さそう。1人目の所持金を1まで減らしたとして2人目の所持金が1のときは? 2のときは? 3のときは? 4のときは? 5のときは? 提出 #37040436 (AC / 120 Byte / 89 ms)。よーく考えた。WA になる例外ケースがありそうな気がしたので先頭の要素だけ特別扱いしたりもした。■精進3。CODE FESTIVAL 2016 Final (Parallel)-C「Interpretation」(水 diff)。以前に見た問題だけどまだ解けていなかった。さすがに前回前々回の ABC-F がともに UnionFind がらみだったので(でもどちらも時間内には解けなかった)、その適応を見逃したりはしない。提出 #37040679 (AC / 327 Byte / 175 ms)。人と言語を2列に並べた2部グラフを考える。今回は解法から発想したので気付かないまま、いわば偶然 AC に至ってしまったけど、問題文を読解するにあたってコミュニケーションが取れることの条件「2 人ともが話すことの出来る言語が存在する」ことと「2 人ともが X とコミュニケーションを取ることが出来る」ことの違いをよく意識しなければいけない。2つの条件でそれぞれ使われている「共通言語が存在する」ことと「コミュニケーションが取れる」ことはイコールではない。共通言語の存在は再帰関数の停止条件であり、コミュニケーションが取れることは共通言語の存在により再帰的に定義されている。後になって問題を反芻していたとき、X 以外の別の人間を介在させてコミュニケーションが取れると判断してはいけない気がして、なんで AC だったのか疑問に思って問題を読み直して、表現の違いに気がついたのだった。■なんだかんだで青 diff が半分くらい埋まってきてるので、そろそろ青入りさせてくれてもいいんですよ。


2022年12月03日 (土) [AtCoder] 精進。今日あったデンソークリエイトプログラミングコンテスト2022 Winter(AtCoder Beginner Contest 280)-F「Pay or Receive」(青 diff)。ヒント、というかほぼ答えを見ました。「へえFってベルマンフォードじゃなくてweighted unionfindってやつ使うのか ルジャンドルも知らなかった」「F: 初見ベルマンフォードかなと思ったけど、制約で間に合わないので却下。辺のコストからポテンシャル定義できることに気づいて、ポテンシャル付きUnionFindを着想。無限にできるかは、閉路ができた時の相対高さで判断できる」 一応自分でも UnionFind の可能性が頭をかすめていたけど、構成する辺のコストの和が非ゼロになるサイクルがあるときでも、サイクルから伸びた腕の中では inf 以外の答えが定義されるような気がして、強連結成分分解が必要だと考えてしまった。解ける可能性はなかった。■提出 #37002677 (AC / 758 Byte / 433 ms)。バグなしで完成してびっくり。UnionFind と言いながら公開関数は U(nite) 関数と DD 関数の2つ。F(ind) 関数は内部でしか使わないので非公開。DD 関数を difference between distances from a root から命名したんだけど、ルートからの距離(D)とは別に2点間距離をあらためて D(istance) と命名しても良かったなとどうでもいい後悔をしている。うまくすれば場合分けが省けるかなと期待して負の無限大を値として使用したけど、無限大と無限大の差から NaN を作ってしまうしょうもないバグを踏みそうで結局 if/finite?/infinite? による場合分けが避けられなかったのが残念。


2022年11月30日 (水) [AtCoder] 精進。ABC129-E「Sum Equals Xor」(水 diff)。数週間前には解けなかった問題。今日の思いつきはこう。ある1のビットを選んで倒す。そのとき、左にある1のビットを a,b のどちらかに割り振る。右にあるビット(0/1 を問わない)は a,b のどちらかを選んで立ててもいいし、a,b ともに0でもいい。これで重複なく数えられる。あとは1のビットを1つも倒さない場合の割り振りを忘れずに。提出 #36886000 (AC / 142 Byte / 133 ms)。