/ 最近 .rdf 追記 設定 本棚

脳log[2025-08-15~]



2025年08月15日 (金) 打ち水っていうのは昼の暑いさなかに撒いても湿度を上げて不快さを増すだけで良くないのだと。気温が下がり始めた夕方に撒くことで下降を後押しするのだということをネットで読んだ。以前に自分が打ち水をする様子を想像したときに、自分だったらバケツの水をぶちまけて終わりにしそうだなと思って、それがいいのか悪いのか知りたいと思って検索をした結果。ということを思い出していてふと思いました。夕方に気温が下がっていますか? 夜気の涼しさを感じるのは日付が変わって数時間後のことではありませんか。あつ。


2025年08月14日 (木) 行李(こうり)」■知っているようで知らない言葉だった。広辞苑には意味が4つ載っていて、順に「(1)(行きおさめる意)使者。」「(2)旅行の荷物。旅行の支度。転じて、旅。」「(3)旅行用の荷物入れ。竹または柳で編み、つづらのようにつくったもの。衣類入れにも使う。「柳―」 」「(4)軍隊の戦闘または宿営に必要な弾薬・糧秣(りょうまつ)・器具などを運ぶ部隊」■人だったり旅だったり荷物入れだったり軍の部隊だったり、いったいなんなのだ。旅にまつわる何かではあるのか。それにしても対象が十把一絡げ(じっぱひとからげ)過ぎない? 同じく ATOK で引いた明鏡国語辞典には「竹・柳などで編んだ箱形の物入れ。かつては旅行用の荷物入れに用いたが、いまでは衣類などの保存に使う。「柳─」 」とだけあり、これは広辞苑の3番目の意味だが、自分が知っていたのはこれ。実物は見たことがないし見てもそれとはわからないけど、柳行李(やなぎごうり)という言葉だけは見たことがある。


2025年08月02日 (土) [AtCoder] 今日は AtCoder Beginner Contest 417 があった。D 問題が難しすぎる。30 分以上かけて AC に至れなかったので捨てて E、F に行った。得点に至らない時間消費は得られたはずのパフォーマンスを下げるムーブ。時間をかけていいのは解けるか解けないかの最後の1問だけ。■A 問題 A Substring。出力する文字数が問題文に書かれてるの親切。最初の文字のインデックスが 0 始まりで A であることを確認したら、書いてある通りに。■B 問題 Search and Delete。どうやっても通る制約ではあるけども、ソートして NlogN で。A 数列が広義単調増加なのに B 数列がソートされていないなんて思いませんでした(サンプルが合わなくてデバッグした)。Hash を使うと定数倍は重いけどオーダーはさらに良くなるのかな。■C 問題 Distance Indicators。苦手な部類だけど式が直で問題文に書いてあるのでさすがに式で考える。必要なものをカウントしながら数え上げるのだけど、ポイントは i と A_i、j と A_j を等式の左右に分けること。値と添字を足し引きしたものは位置(添字)から独立した指標になる。■E 問題 A Path in A Dictionary。小さい頂点番号を優先して深さ優先探索でパスを見つける。再帰関数で実装していて TLE を出している人は訪問済みフラグをクリアしているのが原因ではないかと思う。過去にゴールに至れなかった頂点にあとから再訪して、良い結果が出ることがあるのかどうか。スタックで実装すると再帰関数では出さない TLE を出すことがあって、これは隣接頂点リストを何度も先頭からスキャンさせられることで出る。スタックに保存する状態を (頂点番号, 隣接頂点リストの位置) のペアにする。自分はスタックで実装して隣接頂点リストを破壊的に消費した。スタックがそのまま答えの頂点列になるので自然そうなった。■F 問題 Random Gathering20241218 で実装した遅延セグメント木をコピペするだけ。3秒制限のところ 2984 ms で通ったのはめでたいようで気持ちは虚無だ。ABC だから基礎知識の確認という意味はあるかもしれない。でもなあ。■D 問題 Takahashi's Expectation。まず問題設定が難しい。高いテンションはさらに高く、低いテンションはさらに低くなるようなイメージで長らくいたけど、実は逆で、高いテンションは下がりやすく低いテンションは上がりやすい。その交差部分をうまくマージしたいが、愚直 TLE 解を終了3分前に提出するのが精一杯だった。全部で1時間近く費やしてこれ。クエリの大きさははったりだなと思ったけど、クエリの数もそうなんかな。■■■遅延セグメント木の扱いについてコメントを書いた。提出 #68173358。自分はこういうのはパクリパクられで良いと思ったものをどんどん取り入れて手を入れていけばいいと思ってるんだけど、思ってるだけではどうにもならないわけで。ac-library-rb のような形が一番いいのだろうと思う。AtCoder では前回の言語アップデートからだったか require するだけで利用できるようになっている。遅延セグメント木に関しては制限時間のせいで貼るだけやるだけとはいかないらしいのが、AtCoder における Ruby の立場を弱くしている。■セグメント木に関して prod という用語が自分はわからないんだよね(調べない)。id という名前も同じようにわからなかったんだけど、昨日 ac-library-rb/lib/lazy_segtree.rb での使われ方を読んでいてわかった気がする。IX = XI = X であるような行列 I を単位行列と呼ぶはずだけど、I がたぶん Identity の頭文字。英語では習わなかったけども。ということは、id の名前で返すべきは何の作用ももたらさない操作なのかなと。e と id の区別が難しかったんだよね。最大値を求める操作に対しての負の無限大、最小値を求める操作に対しての正の無限大、数を数える操作に対してのゼロみたいな、初期値としての e とは別に用意される id という「値」はなんだろう、というのが疑問だった。物理的な形式はともかくとして概念としての id は操作ですよね? ということを納得すると、自分の実装で Op#nop? の名前を与えられている機能は Op#id? が相応しかったんじゃないかなあと思ったり。■コンテスト中の提出 #68152111 (AC / 1796 Byte / 2984 ms) と冒頭にコメントを付加しただけの提出 #68173358 (AC / 2433 Byte / 2596 ms)。ジャッジサーバーが使い回しではなく新規立ち上げだから1ケース目だけ 100 ms 余計にかかってる、みたいな話ではなく、全体的に1割程度の時間差がついている。再提出で 100 ms も差がつくことはないだろうと思っていたから意外に大きな差に驚いている。こんなんではコンテスト中に TLE だったものが終了後の再提出では AC になった、みたいなことが十分に起こりうる。特に遅延セグメント木と3乗の DP が解法となる問題ではシビアな定数倍低減が AC と TLE を分けるのでしゃれにならないよ。■■■@2025-08-07 精進。D 問題。提出 #68259724 (AC / 471 Byte / 1172 ms)。コメントに書いたけど「ひとたびテンションが 0..1000 の範囲に入ったら抜け出せない」ことが見抜けるかどうか。見抜けたらその範囲で DP をする。自分は見抜けなかったので 0..500 の範囲+それ以上という括りでクエリ全体を一括シミュレートしてサンプルしか通らなかった (TLE×27/AC×3)。さらにもうひとつどこ以降の DP 結果を参照するかを決めるのに二分探索をする必要もあったらしい。すべてのネタバレ後に実装をした。実装だけなら D 問題だったけど考察ポイントが2つもあると問題を総合的に理解していないと解けない。断片的な手がかりからあれかなこれかなというアプローチでは解けない。「クエリの大きさははったりだなと思ったけど、クエリの数もそうなんかな」と先に書いていた。大きすぎるクエリには二分探索で対応する。(シミュレートするには)多すぎるクエリは 1001 種類の入力にだけ対応した DP で予め答えを出しておく。それでいいそれでできるという判断に必要だったのが「ひとたびテンションが 0..1000 の範囲に入ったら抜け出せない」という洞察。ありませんでした。


2025年08月01日 (金) 部屋全体を冷やすことを考えてセッティングしている人間(俺じゃないよ)に対して「他人のことを考えていない(私に扇風機を独占させてくれない)」はそうとうな言い草だなと思いました。■食卓を確保しようとするのに抵抗して「どこが誰の場所ということはない」と言ったこともある。誰のでもない場所のことごとくをあなたが散らかしている現状をなんとするのか。■こういう人が自分自身のことを他人に気配りができる人間だと自認していたとして、逆説的ではあっても不思議はない。自己を批判する他人の目がないのだから、自分はいつでも完全な人間であり、自分からずれた視点と価値観を持ち判断して行動する他人は不完全で不満の対象でしかない。「自分がしっかり目配りしてやらないと」


2025年07月31日 (木) 咎人(科人)。かなりの人や創作物でトガビトと読まれがちな印象があるけど(自分がそう読んでいたから。“神を斬獲せし者”)、広辞苑と明鏡国語辞典ではトガニンで項目が立っていてトガビトやトガヒトにはない。罪人の読み方がザイニンかツミビトであり、罪科の読みがザイカかツミトガだから、原則に従うならトガビトになるはずだけど、なんでなんだろ。


2025年07月30日 (水) [Firefox] 今の Firefox は 140.0 なんだけど、Firefox を終了するときに「○個のタブを閉じますか? 」って聞かれるようになっている。正確にいつからこうかは知らないけど、以前はたしかに違っていた。ピン留めタブは勘定に入っていないけど、空白の「新しいタブ」は数に入っている。2個の新しいタブを閉じるときに確認してくれる親切! さらに言えば自分はこれら複数のタブを閉じてはいない。次に Firefox を起動したときにはこれらのタブが開かれる設定になっている。一時的に Firefox を終了してタブが見えなくなっただけであって、タブを閉じてはいない。「複数のタブを閉じるときに確認する」という設定の字面を追っているだけのまったくナンセンスな挙動だと思う。なぜ確認が必要かと言えば、失われるからだ。それが1個のタブであれば容易に復旧できるけど、100 個のタブを閉じてしまったらたいへんだ。だから重大な結果を引き起こす前に確認をする。失うものがないときに確認が必要かって話。以前の Firefox はこのへんのことがわかっていた。だから日記に書いた。たしか Windows についても同時に書いた。自分はファイルをごみ箱に入れるときにいちいち確認メッセージを表示させないんだけど、それはごみ箱というのがバッファであり復旧のための仕組みなのであって、取り返しがつくことを確認されるのはわずらわしいだけだからだ(10 回確認したら9回確認するよりミスが減るという考えを自分は支持していない)。なんだけど、ネットワーク越しのファイルをごみ箱に入れる操作をすると、そのときに限ってはこのファイルを完全に削除してもいいかと確認のメッセージが表示される。操作が同じだけど結果が異なるときに、重大な結果を引き起こす前に確認が入る。今の Firefox はなんの必要があると思って確認をしているのだろうか。文言と形式に従うだけのあほであろう。■Firefox (あほ) と Windows のごみ箱/エクスプローラー (えらい) について書いたので Edge の馬鹿についても書こ。バックグラウンドでいつの間にかアップデートしてるんだけど、その度に保存済みのセッションを捨てて勝手なページを表示するんだよね。Edge は常用してないし失われたセッションも1つのページだけなので開き直すのは容易だけど、面倒だし信用に値しないのは間違いない。ユーザーの手間を増やし進捗を失い時間を奪う道具はただただ有害。■■■もうひとつ。ブックマークを Ctrl を押しながらクリックしたとき、バックグラウンドのタブで開いてくれずに開いたタブにすぐに切り替わってしまう。たとえば Ctrl ではなく Shift を押しながらだとブックマークを新しいウィンドウで開くので、キー入力が完全に無視されているわけではない。Ctrl+クリックに限って効いていない。「画像を新しいタブで開く」という右クリックメニューをクリックするときでさえ、Shift/Ctrl キーの併用によって (新しいウィンドウで/バックグラウンドのタブで) 開くことが以前はできていた。これも今は Shift 併用で新しいウィンドウで開くことはできるけど、Ctrl キーによる修飾は無視されるようになっている。これにはタブグループの設定にある「リンク、画像、メディアを新しいタブで開いたとき、すぐにそのタブに切り替える」という項目が新設されたことが影響しているように思う。つまり、以前は新しいタブで開いてそのタブに移動するのが基本で、Ctrl で修飾することによりバックグラウンドのタブで開くことができていたが、今は設定で切り替えるようになり、Ctrl キーによる修飾を設定がオーバーライドしている。ユーザーが今まさに望んで操作している Ctrl キーによる修飾を無視して事前設定に従うのはあほでしょ。ブックマークに至っては設定も修飾も無視して常に新しく開いたタブに切り替えてるし。あほでしょ。


2025年07月28日 (月) [AtCoder] 精進。先週あった ABC416-E「Development」。Ruby で3乗が通るのは N<=300 までなんだよ、N<=500 なんて通らねーよ、とふてくされるつもりでいたのだけど、通ってしまったのだな。■提出 #67995573 (AC / 1862 Byte / 3439 ms)。制限時間は 3.5 秒です。実際のところ苦労したのは TLE ではなく WA の方だった。空港に対応した超頂点の扱いが難しかった。勝手に追加した頂点との距離を答えに数えるわけにはいかないのだけど、クエリ3に答えるための距離の総和を差分更新しないと間に合わないこととあいまって、答えを合わせるのが非常に難しかった。適切な場所に差分の更新をばらまくこと、超頂点との距離は差分更新から除外すること、処理時間を気にしながらこれを適切にこなさなければいけない。■提出 #68014713 (TLE×1 / 932 Byte)。オーダーで考えるとクエリ3に答えるのに N^2 の時間を使っても許されるはずなんだけど、実際にやってみると定数倍の関係で random_27.txt というケースが通らなかった。総和を差分更新するコードをばらまくしかないらしい。■提出 #68015824 (AC / 1056 Byte / 3369 ms)。クエリ1とクエリ2の処理を共通化することでよく似た2つのコードブロックが1つになって、総和を差分更新するコードも2行だけにできた。これには別の理由の助けもあって、クエリ3に答えるのに線形時間を費やすのを許すことで、超頂点と他の頂点を区別せずに差分更新が行えるようになっている。超頂点と他の頂点の扱いを分けたことで最初の AC が出るまでに WA を多数出して苦しんだので、クエリ3にちょっとした時間を使うことで頂点の扱いを共通化できたのは重要。時間に余裕さえあれば短く素直な処理を書いて済ませられるところ、定数倍のせいで難易度が増している事実がある。この2つ目の AC が出るまでにもですね、2か所まで減った差分更新が必要な部分のうち1つが漏れていてサンプルが合わなかったということがありまして、本当はクエリ3に答えるのに差分更新をしたくないんです。■C++ では気にする必要がなくて Ruby には影響することとして、入力の K が 0 になりうるということがある。K=0 のとき D_1...D_K という入力行は空行として存在するのか省略されるのか。どうやら空行として存在しているようだった。C++ の cin を使った入力はスペースと改行を区別せずに変数の型に対応したトークンをひとつひとつ読んでいくけれど、Ruby の場合は1バイト、1文字、1行、特定バイト数、全部読むのどれかになるので、いきおい行指向の処理になりがちで、空行の有無に左右される。空行は存在した。ちなみに、「行」というのは概念的な存在で、引数として改行として扱う文字を与えることで各種文字を区切りとする行を単位に読み込むことができる。でもスペースもしくは改行を区切りとする行は扱えなかったんだな。■解法の本丸であるワーシャルフロイド法の差分更新について。今更書く意味もないけど一応。自分にも初めてのときがありました。超シンプルな3重ループが特徴的なアルゴリズムだけど、最外ループが中継点だというのがひと目ではわからないところ。真ん中と最内ループはそれぞれ始点と終点を表しているけれど、これは交換可能なので、重要で交換不可能なのは最外ループ。辺を追加した状況をワーシャルフロイド法に当てはめると、辺が x-y を繋いでいるとして、中継点を x-y に固定して始点と終点を総当たりすることで新しい辺を使った最短経路が反映できる。だから更新が N^2 で済む。Ruby の場合は定数倍が厳しいので、無向辺であることを利用してループの回数を半分の N*(N-1)/2 にしないといけない。そしてこれだけでは足りないのでさらに小細工を弄するのだけどそれは別の話。二重の配列参照を繰り返すのでなく最初の参照結果を変数に保存するとかのしょうもないことだよ。三重ループの一番内側をシンプルにするのが一番効くのでまずはそこから。そしてループをスキップする判断はできるだけ早く外側で。


2025年07月25日 (金) 目が覚めた瞬間に夢の続きで engagement の単語が頭の中にあり、ふと engagement ring と engage ring のどちらが正解かわからなくなり、調べたら「婚約指輪 engagement ring 《◆engage ring は誤り》」(ジーニアス和英辞典) って書いてあった。エンゲージリングが和製英語だって初めて知ったよ。婚約指輪という概念が各国各言語に存在するかという疑問がまだあります。■~メントからの連想なんだけど、アポイントって言葉の中途半端さはなんだろうね。ベースアップをベアと呼ぶのと同じ大胆さと意味不明さで appointment はアポで十分なのであって、それをアポイントと引き延ばすことに肯定的な意味が見いだせない。■ベースアップを調べたら同じくジーニアス和英辞典に「ベースアップする raise the wage base 《◆ base up は誤り》」って書いてあって、ベアって単語のどこにも本当のことがなくて、和製英語の略語に見せかけてこれこそが正真正銘の新語なのではないか。無から意味を生み出しているのではないか。■言葉の解像度が低すぎて engagement と commitment を分ける機微がわからない。ていうか訳語をひとつひとつ挙げていくのも難しい。すべては雰囲気です。強い関わりとか involving myself 的な雰囲気。


2025年07月19日 (土) [AtCoder] 今日は日本レジストリサービス(JPRS)プログラミングコンテスト2025#2(ABC415)があった。4完緑パフォだけど寝る前に E と F が通ったので気分がいい。どんどんハードルを下げていこうぜ。■A 問題 Unsupported Type。なんで X を最後に与えるのだ。明確な作為を感じる。■B 問題 Pick Two。問題を読みたくありません。# の添字番号を2個ペアにして出力しろという問題だった。読むのに2分、書くのに1分といったところ。■C 問題 Mixture。問題を読みたくありません(※「(読みたく)ないです」は拙く見えるので使いたくないです(←ほら)。意識して避けています。意識しないとうっかり出てきます)。2進数と10進数と指数と 01 文字列が入り乱れて何が何やら。(2^N)*T はやばい大きさだけど状態数が 500000 を超えないというのだからシミュレートする。01 文字列だから2進数として扱おうとしてやばすぎる大きさだと気がついて配列にして、でも配列の添字を2進数の添字(Integer#[])に合わせようと反転したらそれはまったく余計なことで、最後まで混乱しながらの実装だった。提出まで 24 分。■D 問題 Get Many Stickers。値が大きすぎるのでシミュレートはできない。計算でステッカーを数える。交換すると必ず空き瓶が増える(※)。空き瓶の増え方が少ないのを優先して交換を繰り返す。罠があるのかな。空き瓶 10 本を 9 本の瓶コーラと交換できるとして、差し引き1本のマイナスでステッカーが1枚もらえるけど、10 本の元手で 10 枚のステッカーが得られるわけではない。大雑把に計算したあと1回程度愚直に数えるなどした。提出まで 16 分。※日記を書いている今に至るまで問題設定を理解していないことが露呈している。交換しても空き瓶は増えない。瓶が減るだけ。■E 問題 Hungry Takahashi。順方向にシミュレートするとパラメータが2つになるのが困る。ひとつは現在の手持ちのコインで、もうひとつが過去に不足したコインの総数。コンテスト中はやるだけに見えた F 問題に行ってしまったけど、終了後に考えたら逆向きでうまくいけそうだった。いくらあればゴールまで行けるという金額をゴールからスタートまで更新しながら持ち運んでいけばそれがまさしく求める答えになっている。ループの書き方に迷ったのだけど、H*W-1 から 0 までの1重ループがシンプル。ループ変数から行と列と経過日を求めるのは容易。■F 問題 Max Combo。文字の変わり目と連続する数をセグメント木で管理すればいいんじゃないかな。添字からその添字が属する同じ文字が連続する区間を得る方法をバグらせまくって二転三転するうちに時間が終了していた。まさか BIT 上の情報だけでは区間を特定できないと思わなかったんだよなあ(グラフを想像して人間の目では判断できるので、情報の持ち方が下手で不可能なほど難しかったというのが本当のところ。たぶん区間の末尾ではなく区間の先頭を持ち上げるべきだった。そうすれば値が同じ範囲が求める区間になる。なぜそうしなかったのか……)。終了後にランダムテストでバグ取りをしても最初は TLE で、BIT の呼び出し回数を節約したら AC になった。提出 #67766369 (AC / 3233 Byte / 3996 ms)。制限時間は4秒です。BIT とその上位互換であるセグメント木の両方が含まれているのはいかにも無駄なのだけど、BIT の定数倍の軽さがないと通らなかった。BIT で区間の管理をし、セグメント木で連続数の最大を管理している。■F 問題。Ruby から C++ に翻訳したもので AC をとっているこちらの提出 #67766753 (AC / C++ / 912 ms)。セグメント木に6変数を乗せてうまくするとシンプルに解けるらしい。わかりません。文字と連続数と連続数の最大と? 文字と連続数はセグメントの左右の分がそれぞれ必要? セグメントの全体が同じ文字の場合の扱いが特例っぽくなりそうだけど、それは連続数とセグメントの幅を見比べたらいいのかな。一応これで6変数だけどまだよくわからない。Ruby で定数倍チャレンジをしながら確かめる。■■■F 問題。やや時間に余裕をもって通りました。提出 #67790188 (AC / 2091 Byte / 3186 ms)。セグメントの全体が1つの文字のときのマージがバグ続きでくじけそうだったけど、昨日見当をつけたことは外してはいなかった。だけどセグメント木のマージをがんばればいける、ということは見えなかったんだよね。6変数のマージでいけると知ってから考えたわけで。■G 問題を読んだ。昨日の D 問題への提出 #67734593 のほぼコピペがこちらの提出 #67791166 (WA×4/AC×36)。これが AC だったらあまりにも報われないので WA で逆に嬉しい。


2025年07月14日 (月) [AtCoder] 精進。先週(20250712)あった ABC404-F「Jump Traveling」(黄 diff)。コンテスト終了後に「距離 K の隣接頂点があるなら頂点1から BFS をするだけ。距離 K の頂点集合を得る方法はあるか?」と書いていた。まず、BFS をするだけではないらしい。遷移先が多くなりすぎるのだろうか。kotatsugame さんの動画を見たんです(【競技プログラミング】ABC414【実況】)。いみじくも「頂点1を根としたときの深さだけでなんとかできる?」とも書いていたのだけど、そのための秘密兵器が頂点を BFS 順に並べる、ということらしいです。そうするとある頂点の子や、ある頂点の K 階層下の子孫を区間で表すことができる。かつて PAST1-K「巨大企業」を解くにあたって頂点を DFS 順に並べること、それをオイラーツアーと呼ぶことなどを学んだけれど(20200607p01)、今日初めて BFS 順に並べることの利点を1つ知りました。解法のポイントも聞こえてきました。K=a+b であるとして、a 階層上に上がってから b 階層下る移動を考えるとき、a 上がるときに通って来たパスを引き返すように b 下る移動は不正なので除外しなければいけない。でも、b 階層下の子孫も、同じ階層にある除外すべき子孫も、どちらも区間(包含関係にあります)なので扱いが容易。訪問済みフラグを BIT で管理したら BIT 上の二分探索で区間内の未訪問の頂点を効率良く見つけることができる。■提出 #67602188 (WA×34/AC×19 / 2933 ms)。なんでやねん、サンプル通ったやんけ。サンプルが通るまでにも色々ありました。K 階層下の子孫だけでいいかと思ったら1から K まで必要だし、BFS 順に並べるって言ってんのに DFS をしていたりもしました。それなのにサンプルの1は答えが合うんですよ。役に立たねーな。■提出 #67603447 (AC / 2904 ms)。お風呂デバッグをしてきました。頭や体を洗っているあいだは持ち込んだ雑誌を読むこともできないので、ぼんやり考えるのに最適な時間。変更点は 87 行目の1文字だけ。up<kup<=k にした。頂点1に向かって K 階層遡っても、それって1手前にいた頂点だから無駄じゃね? と思って、移動先を K 階層下、1階層上のち K-1 階層下、2階層上のち K-2 階層下、……、K-1 階層上のち1階層下に限定していたのだけど、まっすぐ K 階層上も移動先に加えるべきだったということ。なぜか。折れ曲がるように移動して到達した頂点からまっすぐ K 階層上というのは、初めて訪れる場合がある。K 階層まっすぐ下るだけが移動じゃないのだから「1手前にいた頂点だから無駄じゃね?」は勘違い。■Crystal で通している人の提出 #67550795 を見ましたが、えー、全然違うー。Ruby で同じことをして通りますか? だったらだいぶ短く簡潔に解けるということだけど。■■■寝て起きたらフレンズさんのツイート()や他のブログで読んだことが頭に入ってきた気がする。たぶんだけど BFS をするのかな。頂点ごとに訪問済みフラグを持つわけだけど、追加で K 状態を区別する。これは K 歩の何歩目で訪れたのかを表す。さらに追加で直前の頂点も持つ。直前の頂点へは次の移動ができないのでこれも状態として区別する必要がある。そうすると状態数が NNK になってよろしくないのだけど、直前の頂点が2種類あるとその後の遷移はすべて網羅できているので、3番目以降の直前の頂点フラグはすでに立っているものとして良い。ということが書いてあって、同じことを(もしくは不正確なこと不十分なことを)繰り返しているだけだと思うんだけど、昨日説明を読んだときは何を言っているのかちんぷんかんぷんだったんだよね。何度文字列をなぞっても頭に入って来なかった。脳みその可塑性応答性が低い!■提出 #67610103 (WA×34/AC×19 / 665 ms)。2NK 状態の BFS を書いてみたけど WA だった。サンプルは通るんだけど何が足りないんだろう。■提出 #67610224 (TLE×2)。バグの原因はちょうど K ステップの移動の次の一歩は直前の頂点がどこかに関係なく移動できるということを考え忘れていたこと。これを直して十分に遷移ができるようになったら WA がなくなって TLE が2つ出た。3.3 秒 以下の 3098 ms と 3225 ms だからあとちょっとなんだよなあ。■提出 #67610541 (AC / 2809 ms)。変なことしないで3要素の配列をキューに入れたら良かった。自分で書いたから Crystal の人のスクリプトも読めるようになったけど、N+N の状態数で K ステップを1単位とする BFS をやっているだけに見える。本当に? それだと K ステップの中間ステップが重複する無駄が生じない? (K 歩ごとに直前の頂点フラグがリセットされているようだから)


2025年07月12日 (土) [AtCoder] 今日はミラティブ プログラミングコンテスト2025(ABC414)があった。C 問題に殺された。■A 問題 Streamer Takahashi。日をまたぐことはないので単純に比較するだけ。■B 問題 String Too Long。Ruby なのでオーバーフローを気にしなかったけど、ひとつの数字の上限が 60 ビット(+符号ビット)ってやりすぎじゃない? 100 個足したら 64 ビット超えるよ。■C 問題 Palindromic in Both Bases。全部列挙して積集合を求めるのだと思った。列挙するのが難しかった。いざ列挙できたら実行に時間がかかりすぎだったし最後のサンプルが合わなかった。C 問題に取り組んでいた 55 分がまるまる無駄になった。■D 問題 Transmission Mission。電波強度とは基地局がカバーする幅のことらしい。基地局はどの位置にも置けるので、1つの基地局がカバーする範囲(家から家の距離。重ならない)の総和が答え。基地局が N 個置けるなら答えは0。基地局の数が足りない分だけ1つの基地局が複数の家をカバーすることになる。家ごとに左隣の家との距離を持って、距離が小さい順に左隣の家と基地局を共有する体で距離を強度として答えに計上する。プライオリティキューすらいらない。55 分かけて解けなかった 350 点問題に対してこの 400 点問題は提出まで5分なんですよ。難易度評価どうなってんだ。■E 問題 Count A%B=C。まず愚直解を書いた。b を固定したとき、a が 1 から n の n 通りをとり c は自動的に決まるのだが、b 未満の a から a==c となる組を除外する(ん? 全部だこれ)。また、c==0 となる b の倍数も a から除外する。これらは排反。そうすると 2..n なる b に関して n-(n/b)-(b-1) を足し合わせたものが答え。定数や1次式のシグマの計算はいいが、n/b の合計を愚直に線形時間で求めることはできない。ABC172-D「Sum of Divisors」の高速化と同じことをする (20200628p01←あんまり覚えてないけど雰囲気で)。提出まで 25 分。■F 問題 Jump Traveling。K が 20 以下という制約がくさい。距離 K の隣接頂点があるなら頂点1から BFS をするだけ。距離 K の頂点集合を得る方法はあるか? 終了後に愚直にやって TLE を出した (#67561329)。まずはここから。■直径が小さい木なら N 回の DFS が O(N^2) になる。どうしようか。頂点1を根としたときの深さだけでなんとかできる? ある深さに兄弟がいないときに選択肢を奪われるのがやっかいだし、そうでなくてもよくわからないな。偶奇が合わないと無理っぽい? これが 625 点問題じゃないのはおかしいでしょ。■■■C 問題。WA のち AC。昨日も今日もバグの元は9行目にあった。昨日サンプルが合わなかったバグは、"11,22,33,44,..." の種となる [0,1] と、"1d1,2d2,3d3,4d4,..." の種となる [d,10] (d=1..9) は用意したけど、"101,202,303,404,..." の種となる [0,10] が用意できていなかったこと。そして今日のバグも9行目にあって、N が9未満のケースで N より大きい回文数をうっかり計上してしまっていた。一日空けて落ち着いて清書してなお間違えるこれが C 問題で 350 点だというなら、相性が悪いとしか言いようがない。棒に当たったと思ってもう忘れました。来週また同じ問題が出ても解けません。■D 問題を二分探索で解く。提出 #67586675 (AC)。貪欲法では間違えないけど二分探索だと間違いやすいのは3つ以上の家と家が等距離にある場合だと思う。ある距離を境にして家と家を同じ基地局でカバーするかしないかを分けるとするじゃない。家が等間隔に配置されていると、必要な基地局の数が M より多いと思った次の瞬間には M より少なくなるという状況が起こりうる。同じ距離だけ離れているけど、基地局がいくつか余っているのでそのうちのいくつかだけ個別に基地局を割り当てますよ、という状況が起こりうる。貪欲法だと基地局の数をベースに答えを求めるので間違えないけど、二分探索だと距離をベースに基地局を数えるので、同じ距離だけ離れてるけど基地局を分けたり共通化したりと扱いを変えてちょうど M 個の基地局を使い切らなければいけない、というところに難しさが生じる。自分の提出では4行目で距離を N 倍して N 未満の添字を加えることですべての距離を区別可能にしてから二分探索をしている。そして総和を求めるときには N で割ったものを足す。たいへんですよ。未満と以下を間違えて一度 WA も出したし (#67586560)。判定関数はこちらのツイートと同じはず。「岩井星人さん「@4C3pfotQDj26958 ありがとうございます! 座標の左から見ていって、「幅X以内であれば一つの電波塔で賄う」を決めていって、電波塔の個数がM以上ならXを大きくするってやってました」」 自分のは左から見ていく代わりにソートして二分探索をしてるけどそれは単なる効率の違いなので……と思ったけど、logX と logN の違いだけで効率もほぼ同じ?■二分探索がダメな例としてこういうリプがついている。「hibitさん「@yiwiy9 6 3/1 4 5 8 11 12 正しくは 5 になりますが、恐らく最小値の二分探索だと 7 になります 正:{1},{4,5,8},{11,12} 誤:{1,4},{5,8},{11,12}」」 「幅X以内であれば一つの電波塔で賄う」の解釈が自分と違うんだよな。前から見ていくと、(1,4)←距離3以下だから同じ基地局、(4,5)←距離1だから同じ基地局、(5,8)←距離3だから同じ、(8,11)←距離3だから同じ、(11,12)←距離1だから同じ、結局「幅3以内であれば一つの電波塔で賄う」ことにすると {1,4,5,8,11,12} になって必要な基地局が1つだけなので条件が緩い。次は0と3の中間である1か2を条件にして二分探索を続けよう、ってならない? その後幅1と幅2のどちらを条件にしても今度は必要な基地局が {1},{4,5},{8},{11,12} の4つになって使える基地局の数(3)を上回ってしまうので、解は2と3のあいだ!(困る) というのは別の話でありもう書いたこと。■もうひとつの解釈がわかった。左から見て最初の家が1にある。ここから幅3を数えて4までの家を1つの基地局でまかなう(4に家がなくて3に家があるならもちろん3までしかカバーしない)。次は5に家があるから幅3として8までの家をカバーする。……。これはカバーする範囲と範囲のあいだの隔たり具合を無視しているという点で合理性がないんよね。思いつかない。


2025年07月08日 (火) 事業所で水槽の水がサイフォンの原理を使って排水溝に勝手に吸い出されていくのを見て、所員達が「なんで水槽を超えて水が流れていくのか解らない、、気持ち悪い」ってざわついた - posfie」■サイフォンという名前と現象はよく聞かされても結局どういうことなのか誰も説明してくれない。落ちる水の重さが新しい水を吸い込んでるイメージだけどどうなんだろ。「サイフォン」(ja.wikipedia.org) から「途中、どれくらい高い地点を通ることができるかは大気圧および液体の蒸気圧と密度による。最高地点において管内の圧力が液体の蒸気圧に近づくと液体はキャビテーションを起こしはじめ、気泡の膨張が重力による圧力差を吸収してしまい、いずれサイフォンは停止する。」 へー。持ち上げるためには大気圧に負ける圧力が必要で(?)圧力が低くなりすぎると水中から気体が出てきて(沸騰?)吸い込めなくなる? 気泡が圧力の伝達を阻害するのは油圧ブレーキのエア抜きが大事な理由だし長い下り坂でエンジンブレーキを利用すべき理由でもある。大気圧の大きさは気泡が生じるまでの限界を高めそう? 大気圧を固定したとき、液体が水銀のときの限界が約 76 cm で、水のときの限界が 10 メートルくらいに決まっているらしい。大気圧と液体の蒸気圧と液体の体積当たりの重さ(密度の言い換え。物理をやらなかったので重さと質量の区別は曖昧。面積当たりの力である圧力に呼応するもの?)の3つのバランス。水銀の限界は 760 mmHg (大気圧) と符合しているけれど、じゃあ水銀の蒸気圧が限界に及ぼす影響はどこに読み取ればいいのだろう。蒸気圧って? 「2010年、オーストラリア・クイーンズランド大学の物理学者、スティーブン・ヒューズが辞書など社会で一般に説明されているサイフォンの原理は誤りであると指摘した」とも書かれていた。今からたった 15 年前のこと。みなさんそれも踏まえたうえで「わかる」「あたりまえ」という反応をしているのだろうか。自分は名前と結果しかわかりません。


2025年07月07日 (月) [Win11] タスクスケジューラで「前回の実行時刻」「次の実行時刻」カラムをクリックしてソートすると、▲と表示されているときに降順で、▼のときに昇順でソートされている。きもちわる。ちなみに時刻の昇順(小さい順)、降順(大きい順)というのは時刻を UNIX epoch からの経過時間として理解すると間違えない。要するに、▲のときに新しい順、▼のときに古い順で表示されていると言っている。きもちわる。