/ 最近 .rdf 追記 設定 本棚

脳log[2025-12-27~]



2025年12月27日 (土) [AtCoder] 今日は AtCoder Beginner Contest 438 があった。21時に間に合うようにお風呂に入っているときからおなかが苦しかった。様子を見ていたら途中離脱が不可避だと思ったので急いで出してスタンバイ。幸いにしてコンテスト中に本日3度目のうんこが出てくる気配は見えなかった。■A 問題 First Contest of the Year。計算でやるのは無理です。A 問題は間違えないことが一番大事。7ずつ刻んで2年目の初日を掴まえた。■B 問題 Substring 2。こういう問題は必ず両手の指を使って長さ N から長さ M の連続部分列がいくつ切り出せるかを数えます。N-M+1 個でした(覚えない)。他の人の提出を見て Enuemrable#each_cons(M) を使うのが目的にピッタリ適って計算もいらなくて良かったと知った。知らないメソッドではないんだけど出て来なかった。あとは (s-t)%10 と (t-s)%10 を取り違えていたことに問題を読み直すまで気づかなかったりといういつものぐだぐだ。極めつけはデバッグプリントでは答えがちゃんと出ているのに出力が誤っている。デバッグ出力用の式だけ修正して本番の式がそのままだ。両方の式を揃えてもう何度目にもなるサンプルを試してみても、まだ出力が誤っている(デバッグプリントは正しい答えを見せている)。同じ式から異なる答えが出てくることの意味がわからなすぎて音をあげる寸前だった。からくりはこう。p(S.size-T.size+1).times.map{...}.minp (S.size-T.size+1).times.map{...}.min の違い。スペースの有無で解釈が変わる。ふりかえれば今日はスペースが抜ける日だった。入力を受け取るテンプレ N = gets.to_iN= gets.to_i のようになってしまい離すために戻るということを今日は少なくとも2回やっていた。getsgest になるみたいなミスはいつものことだけど、スペースが抜けるというのはこれまで例がない。親指のコントロールが失われているのか寒くて指がかじかんでいるのか。■C 問題 1D puyopuyo。前から順番にくっつけて消す。連鎖はない。■D 問題 Tail of Snake。前から順に3つの値を更新していくだけで答えが出るらしい。自分は一度に全部考えることができなかったので、必要な情報を分けて予め準備していた。どういう情報か。ある要素(2番目から N-1 番目までのどれか)を胴体に選ぶとして、それより左で最も効率良く頭と胴を分けたときの最大値が何か。これは2要素の DP でできる。右側についても同様に求めて、左右を足し合わせたときに最大になる要素を選ぶ。サンプルの1と2が合って3だけが合わなかった原因は何か。左側について頭と胴の組み合わせを前計算し、右側については尾と胴の reverse で前計算をしなければいけないところ、尾の数列をどこにも使っていなかった。頭と胴だけで計算してどうしてサンプルの1と2が合うのか、役に立たねーサンプルだ。必須条件の扱いについて。3つの数列の1要素目については頭専用として予め取り除いておいた。N 要素目についても尾専用として取り除いておいた。胴についてはどれを胴にするのがいいかを総当たりするということでクリアしている。■E 問題 Heavy Buckets。ややこしいのでじっくり読んで問題を理解する。バケツリレーが行われる。バケツの行方を追跡したい。たらい回しのルートは決まっている。バケツの位置が即ち水の加算量。問題がわかれば1分もかからずにダブリングだなと見当がつく。固定され循環する未来が先読みできない道理がない。実装には 30 分かかる。1個先、2個先、4個先の位置はどこか。1個移動する、2個移動する、4個移動するあいだに加算される水の量はいくらか。この2つを 30 ビット分前計算した。■F 問題 Sum of Mex。40 分手が動かなかった。考えていたけど、傍目には寝ていたのと同じだった。前にも書いたけど、MEX って性格が悪い。物事を定義するのに否定で定義するんじゃあないよ。ないものは具体的に掴まえられないんですよ。一応しっぽはつかんだ。f 値が N になるのは一直線のグラフだ。1 から k-1 までの k 個の頂点(+中間に余分があっても良い)がまっすぐ並んでいるとき、両端の2頂点に繋がる頂点の組み合わせが f 値を k にする。ここから考えるのをやめたくなったのは、k より小さい m があって、f 値が m になる頂点の組み合わせを考えるとき、f 値が k だった頂点の組み合わせがまた出てくるよね、というところ。嫌だ。■F 問題。「1 から k-1 までの k 個の頂点(+中間に余分があっても良い)がまっすぐ並んでいるとき、両端の2頂点に繋がる頂点の組み合わせが f 値を k にする」と書いた。中間の余分の頂点が k と k+1 を含んでいたら f 値を k+2 にしなければいけない。■■■E 問題。類題として2問、ABC179-E「Sequence Sum」と ABC241-E「Putting Candies」が挙げられていた。過去の自分はどうしていたかなと見てみたら、ABC179 は D 問題で撃沈されていて E は D ともども翌日に通していた (提出 #16923150)。ABC241 の方は D をあきらめて E をやっていたらしいが AC は終了 11 分後だった (提出 #29711639)。どちらも解法はサイクルとサイクル長を検出するグラフ解法だった。まだダブリングを知らなかったと見える。ダブリングを最初に覚えたのは LCA を求めたかったとき。それだって LCA を求めるのにダブリングでないといけない理由はないので、オイラーツアーより後だったと記憶している。噂に聞こえるダブリングというものを実装してみるチャンスだと気が付いてやってみたら、最初は BIT やセグメント木や std::set の外側で二分探索のループを回すような、log が二重に付くやり方をしてしまって TLE になって、何かが間違っていると気が付いたのだった。今回の E 問題が自然とダブリング解法になったのは、たくさんのクエリに答える必要性からだったと思える。たくさんのスタート地点があり、たくさんのなもりグラフがあるときに、連結成分の形をひとつひとつ調べてはいられない。考えるより高速でシミュレーションを回したい。


2025年12月22日 (月) [BAD BOY] スプロケットがぐらぐらしていることとフリーボディから錆が無限湧きしてくることの対策として注文したホイール(SHIMANO WH-RX010)が届いたのだけど、ディスクブレーキ専用でリムブレーキに非対応なんだって! たしかにシルバーの輪っかが外周側面に見えない。気が付かなかった。(ディスク化の可能性を潰さないために)ディスクブレーキに対応したハブやスポーク配列であることばかりチェックしていたら、今やリムブレーキが当たり前ではなくなっていた。これがいいというよりは他に選択肢がなくて間に合わせで買ったホイールが、間に合っていなかったということにたいへん残念な気持ちになっている。これをポジティブに変換するために後ろブレーキのディスク化を進めるつもりだけど、出費が続き過ぎ大き過ぎでつらい。


2025年12月21日 (日) タイムズのシステムが入っている銀行の駐車場に車を止めて、銀行で用事を済ませて、精算をしたら無料時間を過ぎているから何百円か払えと言われる。そんなはずがない。無料時間は 20 分で、自分は 15 分以内に用事を済ませて来たのに、車を止めたのより 15 分以上早い 09:30 からのカウントで無料時間が過ぎていると言われる。その日のスケジュールではその時刻に車を止めることは完全に不可能なのだ。ところで、時間を計る目的において時刻の正確性は問題にならず、この駐車場の駐車券に印字される入庫時刻が自分のスマホの時計とは2分程度ずれていることを以前から知っている。でもその程度の誤差だし、銀行で過ごした時間が 15 分に満たないことは間違いないので、時間の計測開始時刻が不当に早かったことは間違いがない。■どうしてそのようなことが起こるのか。一度止めようとした人が考え直して出て行って、15 分後に自分がそこに止めたのだろうか。しかしロック板は? 上がっていたのを見なかったし、乗り上げた感触もなかった。センサーは? 調べたらほぼループセンサーというもので金属を検知しているらしい。他には光センサーや超音波センサーの場合もないではないと。もちろん進んだところではカメラでナンバーを見ている。たとえば不正に脱出した車があったとき、センサーが車の存在を感知できなくなったとして、駐車時間のカウンターがリセットされることがあるのだろうか。必ず次の駐車車両にツケを支払わせるようなロジックになっていないだろうか。とはいえ、そういうことを想定するとしても今回の場合は、無料時間内(15分程度)に不正脱出する理由がないことと、15 分後にまだロック板が上がっていないなんてことがあるのかという疑問がある。どうして自分は 15 分程度余分に駐車時間をカウントされてしまったのか。「タイムズの場合、ズバリ「3分後」にロック板が上がる事が多いです。 基本的には3分後ですがこの数値は設定で変更する事ができ、ATMなどの用事で短い時間しか滞在しない事が多い銀行などに併設されているタイムズの場合は「10分後」と、かなり長めに設定されているようです。」と書いているページもあるので、この銀行の設定が 15 分だった場合に、駐車時間のカウントがスタートしているがまだロック板が上がっていない駐車枠にタイミング良く自分が車を止めてしまった、ということが考えられないかな。ないかな?■この日記を書いている本題はここからで、こういうことがあったよ、君達も駐車券に不正確な入庫時刻が印字されていないか注意してないと余計な請求をされちゃうよ、という話をしたときのことだ。話がそれるけど、自衛のための注意が必要なのは本当のことで、入口にいて車の誘導をしているおっちゃんは曖昧な反応で俺がほんの 15 分前に車を入れたということを請け合ってくれなかった。銀行の中にいる人に事情を説明したところで、銀行の中で 15 分の用事を済ませる前に別の用事をしていて無料時間を超過してしまったのでしょうと思われるのが関の山だ。そして本題。09:30 に自分が銀行にいなかったと知っている人が、機械を信用して無料時間の超過を俺の責任にしようとする。機械のすることだからという理由で機械を信用している。ネットでパーキングの解説記事を調べてみて「センサーが車を検知して……」のような記述を読んで、「ほらほら」と俺にはわからない理由で謎の確信を得ている。「センサー」とだけ書かれてるけどそれが何を検出するセンサーなのか気にはならないのですか。センサーに検出できる限界があるとは思わないのですか。ロック板が上がったり下がったりする時間を設定で「いい具合」に調節するという事実が、仕組みの限界や避けられない(けれど最少化しようとしている)落とし穴の存在を示唆しているとは思わないのですか。こんな具合に機械のやることだからという理由にならない理由で人閒より上位に機械を置く人閒が身近にいたことが怖かった。仕組みが想像もできない機械は魔法で動いていると思ってるんだろう。俺もたった今魔法という言葉を、人間業ではないから間違いのないもののたとえとして使っている。実際に魔法を使う人間を知っていれば、その人間の為す他のことと同じ程度に魔法も信用のおけないものになるはずだ。機械も具体的に知れば知るほどありとあらゆる失敗が想定できるのにな。■お前は人閒一般の話にしたがっているが特定の人閒=お前に信用がないってだけなんじゃないの、という突っ込みはあろう。だったら判断力の怪しい盲信的な人閒はいなかったということで、良いですね。AI の御託宣を鵜呑みにして他人の話を聞かない人閒が多数派になる未来は怖いもんね。


2025年12月20日 (土) [AtCoder] 今日はユニークビジョンプログラミングコンテスト2025 クリスマス(ABC437)があった。先週と同じように時間だけはあるのに G 問題に手も足も出ない。■A 問題 Feet。よくわからない制約。その上限にどんな意味が?■B 問題 Tombola。トンボラって何? 愚直にやるだけなんだけど、最初に集合の引き算 A-B をして、違うから B-A をして、実は積集合 A&B が正解だったという沼にはまっていた。頭を使ってください。■C 問題 Reindeer and Sleigh 2。トナカイと橇。前回(1)は Sleigh が読めなかったということを覚えている。英語の場合 ei をエイって素直に読んでいいんですかという疑いが最初に来るので。トナカイって匹じゃなくて頭で数えたいよなあという感想を持ったのも前回と同じ。しばし考えた。考えたのはどういう DP をするか。一見するとパラメータが2つあって貪欲法がなじまない。だから DP。DP ができる制約には見えないけど、ずるができないなら全部を効率的に調べるしかない。それでどういう状態を持つか。考えていると、そりを引くトナカイがそりに乗るトナカイに転じるとき、引くパワーがマイナスになるのと同時に、重さもパワーにマイナスに作用するという点で影響が共通の値で表せることがわかる。じゃあとりあえず全頭引く側にまわってもらって、負の影響が小さいものから貪欲に可能な限り乗る側にまわってもらう。そこからぐだぐだ時間がかかるんですねえ。受け取るパラメータ(w,p)の順番を間違えたり、マイナスに作用する値を w-p にしてみたり w+p にしてみたり、処理順が反対だったり、いつのまにかソートが消えていたり。ああでもないこうでもないといじくって全体で 14 分かかった。解けたと思ってからの方が長い。■D 問題 Sum of Differences。ソートして累積和と個数で計算する。手を動かすだけで4分。実装が二分探索と尺取りに分かれるみたい。自分はこの程度の単純さなら尺取りの方がわかりやすいので尺取りでやっている。二分探索だと返ってきた探索結果の位置づけを off-by-one エラーに注意して吟味する必要があるが、尺取りだと尺を取る操作そのものによって扱っているものの意味づけが明確になるので悩まない。尺取り操作が複雑になる問題ではこれが逆になって、二分探索でスッとコンテキスト外から値を差し出される方がロジックを明確にしやすかったりする。 ■E 問題 Sort Arrays。問題文が難しい。「言い換えると……」があまりにも親切。それなしでは理解できなかった。時間大丈夫かなと不安に思いながらとりあえず 12 分で出したものは WA だった (TLE はなし)。手元ですぐにダメケースが作成できた。それは異なる Ai が同じ列である場合。再帰関数で実装したので自然と DFS 順に答えが出てくるのだけど、同等の数列を束ねる BFS 的な処理順も必要だった。完全に BFS というわけでもなかった。難しいよー。結局追加で実装に 14 分かけた。合わせて 26 分+ペナルティ5分。■F 問題 Manhattan Christmas Tree 2。45 度傾けるというあれですか? 傾け方はよくわかりませんが、見たことのある x+y と x-y のそれぞれに対して最大値を取得するものと最小値を取得するものの2通り、全部で4つのセグメント木を用意して、やってみたらサンプルが合ったので提出して AC。手を動かすだけで 14 分。■G 問題 Colorful Christmas Tree。2乗が許される制約。木 DP でできるんかなというかそれ以外にやりようが思いつかないんだけど、3値の子供の処理順をやりくりするだけでもたいへんなのに、どこに親との辺を取り除く処理を挟むかという可能性まで関わってくると整理しきれない。おてあげ。■自分のすべての提出。手も足も出ない G 問題を前に時間を持て余していたのが先週と同じだったように、順位とパフォーマンスも前回と似たものだった。前回と違う点を探すと、6完最速との順位差が 200 番程度ではなかったということ。なんと6完最速は順位表の2ページ目、38 番にいる。今日は G 問題の崖が一際険しかったと言えそう。F 問題を 1500 人以上が解いているのは先週今週変わらず。■■■匹と頭について。検索すると一筋縄ではいかない。まず伝統的には匹のみが長く使われていた。特に馬と匹の結びつきが強い。しかし頭がある現在は、大型の獣にはもっぱら頭が使われる。しかし対象が小型でも頭が正式に採用されているケースがある。つまりどちらをつかっても間違いではない。現代的な感覚で判断すると頭になるというだけのことだった。■■■F 問題。自分は C++ 用語で言うと2種類のセグメント木クラスをインスタンス化して解いたんだけど、動画やテキストで見かけたのは、コードは1種類だけで保持する値の符号をあれこれして4通りの結果を得るやり方だった。難しすぎると思うんだけど、どういう脳内モデルがあると初手がそれになるんだろう。……と書いてから再度訪れてみたら、答えがまんま書いてあった。「二つの座標 (X,Y) と (x,y) のマンハッタン距離は ∣X−x∣+∣Y−y∣=max((X+Y)−(x+y),(X−Y)−(x−y),(−X+Y)−(−x+y),(−X−Y)−(−x−y)) と表せることが良く知られています。特に難しい理論が必要なわけではなく、絶対値が二つあるのでそれの正負の組みせで展開するとこうなります。」 式を操作していたのね。


2025年12月17日 (水) 高木浩光@自宅の日記 - 知財検討会にまで及ぶAI規制の混迷──処遇AIと生成AIを混ぜると、全部壊れる」■AI ってこんなに有能なんだ、と驚きました。私は AI 以下です。AI の有能さを引き出すこともできそうにありません。ところでですね、これだけのやりとりを重ねるのなら、一言一句自分の言葉で書きたいと思わないのかなと思わないではないのです。自分がそういう(たち)なので。早さとか作業の並列性とかが理由なのかな。人の上に立つって大変だ。


2025年12月13日 (土) [AtCoder] 今日は AtCoder Beginner Contest 436 があった。F 問題までについての話だけど、あまりにも淡泊な問題ばかりで、新入生歓迎シーズンかなと今が何月か考えてしまった。年末でした。■A 問題 o-padding。数を1つも間違えずに計算できる自信がないので、十分な長さの文字列からちょうど長さ N の文字列を切り出しました。■B 問題 Magic Square。何を言っているのかさっぱりわからない。何をさせられているのかわからないまま機械的に翻訳しました。とまどっていた時間を含めて所要時間5分。■C 問題 2x2 Placing。配列にメモをすると空間的にまずいので Hash 表に記録をする。■D 問題 Teleport Maze。F までで一番時間を使った (18 分)。考える要素はない。BFS をする。何度もワープをしないように対策をする。ノータイムでそれがわかるのに時間がかかるんですねえ。一番手間取ったのは、キューには迷路での位置を表す添字を入れたのだけど、添字とワープを表す英小文字を混同してうまくワープできていなかったことをつきとめるのにえらく時間がかかった。つまり、添字から文字を参照し、文字からワープ先を参照する必要があったのだけど、添字からワープ先を参照しようとしていたということ。自分は普段訪問済み情報にグリッドの情報を予め埋め込んで、ループの中ではグリッドを参照しないでもいいように心がけているのだけど、無理だったと。無理だということが直視できていなかったと。普段の心がけから起こるべくして起きたミス。 あと同じくらい時間がかかったのが、ゴールマスの添字がいくつになるかということ。何度もサンプルのグリッドのマス目を実際に数えて、それが H×W のグリッドだといくつになるかを考えたのだけど、何度数えて何度計算しても1ずれてたの! ちなみに迷路は各行の末尾に番兵を置いたうえで1次元化していた。なんで1ずれたかというと、ゴールのある最終行の番兵の位置まで添字を1マス1マス数えていたからですね (最終行に限って番兵を数えてはいけない。それはゴールの次のマスだ)。やはり A 問題で対策したように計算しない方策を選ぶべきだった。■F 問題 Starry Landscape Photo。E 問題と 25 点しか違わないので、E と F 両方解けるにしても両方解けないにしても F 問題からとりかかって損がない。往年の F 問題って感じ。つまり、後ろに2問控えていた頃の? 「あなたは BIT (あるいはセグメント木) を知っていますか」。知っています。まず、何番目に明るい星まで写すのかを決める。今決めた星は必ず写す。この区別によって同じ構成の被写体を複数回カウントすることを防ぐ。あとは、左右にあるそれより明るい星をいくつずつフレームに収めるのかを決める。その通り数。計算式が二転三転したことにもう驚きはない。数字とは友達になれない。左に L 個、右に R 個の明るい星があるときに、中央にある1つだけを写す場合を含めて 1+L×R 通りではないんですよ。(L+1)×(R+1)-1 通りでもないんですよ。テキトーやってんじゃねーんですよ。答えは 1+L+R+L×R でした。わけるわけなくない? 頭を使ってどうぞ。■E 問題 Minimum Swap。ちょっとひねった問題設定でした。「1 回目の操作としてあり得る操作の数を求めてください」。要するに、答えに近づく1手であれば何でも良い。無駄な操作でなければ何でも良い。無駄でない操作とは何か。第一感は「交換した結果少なくとも一方が正しい位置に納まる操作」だった。嘘くさいなー。N=3、N=4 で嘘を暴こうとシミュレートしていて思い出したのが、すべての並べ替えは平行して存在する単数または複数の玉突き位置交換ループの足し算だということ。ということは数列を漏れなく玉突きグループに分けたときそれぞれの大きさがわかれば、グループ内で位置を正す操作の選び方は、2個を選ぶ組み合わせの数……だと思って AC だったんだけど、今になってわかっていなかったことがわかってきている。グループ内でどの2個を選んで位置を交換しても必ず正しい位置に近づいてるんですか? わかりません。こうである必要がある、を答えにしてたまたま AC だったけども、それだけで良かったのかどうかは考えていなかった。■F 問題。提出前に 1+L+R+L×R の式を見て一度だけ因数分解を考えて捨てていたのだけど、他の人の提出を見て (L+1)×(R+1) で表せることに気がついてしまったね。第2案で無駄に -1 をして答えを間違えていたことも、因数分解をしようとして失敗していたことも、とにかく中学生レベルの数学ができないことが露呈している。コンコンコン……入ってますか?(入ってません)■F 問題。通り数の計算式以外にもバグらせていた。処理の昇順と降順が反対だった。原因はたぶんだけど、明るさの表現として「1番明るい」と「明るさが N (最大)」の2通りを混同して区別なく使用していたのだろう。■自分のすべての提出。平均すると1問あたり8分で解いてるんだけど、その短時間でこんなにもバグがてんこもりなことに我がことながらあきれます。■■■E 問題みたいな並べ替えについては過去に散々苦しんだ経験がある。第二回全国統一プログラミング王決定戦予選-C「Swaps」(20191111p0120200826p01)から始まって ARC120-C「Swaps 2」(20211022p01)、ARC124-D「Yet Another Sorting Problem」(20211125)。Swaps 2 だけ毛色が違うけど他の2問は E 問題に繋がる問題だった。そこで散々数列をこねくり回した経験からひとつの見かたを獲得した。過去の日記でも触れてるけど、「競プロerのための群論 (swapと順列と対称群) - little star's memory」のようなありがたい記事を読んでも全然理解できないし身にもつかないのです。


2025年12月06日 (土) [AtCoder] 今日は AtCoder Beginner Contest 435 があった。終了1分前にバグの原因に気がついて修正して提出してコンテスト終了後にまだジャッジが進んでいるのをドキドキで見つめていた。それが E 問題。今日は F 問題までそれなりの早さで解かないといけないセットだったらしいです。■A 問題「Triangular Number」。三角数? N*(N+1)/2 ■B 問題 No-Divisible Range。愚直に、やります。■C 問題 Domino。どこまで倒せるかをメモしながら左から倒していく。違った。どこから倒せないかをメモしながら左から倒していく。■D 問題 Reachability Query 2。黒いマスを始点にして逆向きに辺をたどって通り道の頂点も黒く塗っておく。どの頂点も高々1度しか塗られないし、塗られたときにしか遷移しないので、全体で N+M に比例した処理。クエリ1で与えられる頂点がすでに黒いかどうかを確かめずに無条件に探索を開始したら TLE×2 を食らった。テストケースがいい仕事をしている。多くの辺を集めている頂点が何度も始点になったら、たとえその次の頂点が黒で探索がストップするとしても、最初の1ステップが O(M) で死ぬ。■E 問題 Cover query。区間の併合。BIT で区間の始点を管理した。座圧が必要。とてもやっかい。時間をかけて丁寧に書き何度も読み返し2歩進んで1歩戻る慎重さ……というか自分が今何をしているかを思い出す時間を確保しながら書いていた。とてもやっかい。最後まで見つからなかったバグとは何か。BIT で管理している区間の始点の集合が壊れている。単調増加のはずなのに途中で減少したりしていて、それでは BIT 上の二分探索ができない。なぜ壊れたか。ある位置を含みうる区間(始点がある位置以下にある直近の区間)を BIT から検索していたのだけど、ある区間の始点を基準にして、その位置を含みうる直前の区間の始点を検索していた。何が見つかるかは火を見るより明らかなんだけど、座圧をしているとデバッグプリントの解読が難しくて思い違いになかなか気づけない。十分に早い SortedSet があれば座圧は必要ないのになあ。遅延セグメント木を使う解法と、BIT を使っていながらもっとシンプルな解法があるみたいなのと、自分と同じような解法ながらずっと早く提出している人がいた。要するに、考えが足りず、実装も下手だった。これが現在の自分。■F 問題 Cat exercise。実装前にいろいろ考えた。移動を開始すると移動可能な範囲は必ず左右に2分割される。左右のどちらに移動させるかは選べる。移動先の高さを選ぶ意味はあるだろうか。……ない。じゃあ左右の移動先を効率良く見つけるためにセグメント木と値から添字の逆引きインデックスを用意すれば終わり。E 問題より簡単。「……ない」の点々部分について書く。移動先を選ぶということは、(1)優先される移動先を予め取り除いておく、(2)移動範囲を予め制限しておく、のどちらかを実行することになるのだけど、(1)をするくらいなら優先される高いタワーに寄り道をする方が移動距離が増える。(2)を実行するのは今ではなく制限のために取り除くタワーの隣に移動してきたときでいいし(つまりこれが左右の移動先を選ぶというときの実際の操作)、そのときを待つ方が移動距離が伸びる。■■■F 問題。O(N) で解けると読んだので考えてみた。頭の体操。こういうときに使えるデータの持ち方を知っている。AtCoder を始めたごく初期の日記に書いてある(脳log[20190907p01] AtCoder Beginner Contest 140 E問題)。結局、左右にある直近の現在より低いタワーの位置が定数時間でわかればいいのだ。高さ N から降順でやるのに失敗したので逆に、高さ1から昇順でやることにした。左右にあって最も近くの現在より高いタワー(左右1つずつ)に情報を伝えていく。提出 #71557988 (AC / 165 ms)。


2025年12月03日 (水) 「このテスト関数には問題があります。呼び出しても依然としてエラー終了するおそれが残されており、安全な実行を保証しません」という警告に対して、問題のあるテスト関数によるテストを取り除いて問題を解消していくスタイル。


2025年11月29日 (土) [AtCoder] 今日はSky株式会社プログラミングコンテスト2025(ABC434)があった、と書いている今は日曜日の夜です(日曜日の日記は ARC のために空けておきたい)。D 問題に負けた。茶色からやり直した方がいいよ。■A 問題 Balloon Trip。「AtCoder では秒と分を混ぜたような問題は出さないし、答えに単位も要求しない」と書いたのが先月のこと。単位が出てきました。「単位が kg であることに注意してください」と注意があるなんて学校の問題よりなんと親切なことか。小学生は 1000 を掛けるのか 1000 で割るのか迷うんですよ。でもそれだけ。■B 問題 Bird Watching。数と大きさの和がわかれば平均が計算できる。■C 問題 Flapping Takahashi。高橋君が存在しうる下限と上限を更新しながら判定をする。判定条件に一瞬迷ったけど、下限≦上限で間違いではなかった。いつものように all?any?none? といった Array のメソッドで入力を受け取りながら同時に判定をすると入力を受け取り切らなくて次のケースが狂うことに注意した。■D 問題 Clouds。計算量の見積もりができなかったのが敗因。2000×2000 の二重ループも、全体で N に収まるループも許されているけど、それらが組み合わさって 2000×N のループになっていることに気づけなかった。気がついたらやりようはある。雲のひとつひとつにハッシュ値を割り当てて重なり合いを xor で計算するならグリッドを走査するのに伴う雲の足し引きは定数時間の計算になる。提出 #71342582。どこかのブログを読んだ限りではもっとオーソドックスな解法があるなんてことない D 問題だった雰囲気があるけども、グリッドではなく雲の座標を伝っていくようにすると間に合うんですか?■E 問題 Distribute Bunnies。終了後に読んだけどわからなかった。似た問題が ARC-A あたりにあったのは知っている。たくさんの二択。UnionFind だと見かけたので UnionFind で解いた。でも UnionFind でいけるということが見抜けるようになったことを意味しない。カードに関する問題だったと思ったから AtCoder Problems で問題名を検索したら ARC111-B「Reversible Cards」がそうだった。400 点問題。4年半前の自分の提出 #21761198。ストレートに UnionFind ではないけど UnionFind っぽい処理をしている? 解説によれば連結成分ごとに DFS などで木かどうか判定すれば良いと書いてある。自分の今日の提出 #71357456 が木の判定をしているのかどうか知らないので2つが同じ問題なのかどうかも確かではない。■D 問題。雲が何枚重なっているかをマス目ごとに数えた後で、雲の厚みが1のマスの2次元累積和を作成し、雲ごとに、領域内に厚み1のマス目がいくつあるかを数えるらしい(「ABC434 振り返り - naoya - Obsidian Publish」)。厚み1のマス目の2次元累積和を用意するステップが完全に想定外だった。グリッドを走査するときに同時に1枚だけの雲がどの雲かを特定しようとしていたから TLE になっていた。その段階では枚数だけを数えておけば良かったのだ。2次元累積和を使って A-B-C+D の式で任意の矩形領域の和を得るのなんて簡単だよ。■■■D 問題。雲にハッシュ値を与えて XOR で重ね合わせをしたと書いた。実は最初は足し算と引き算で雲を重ねたり取り除いたりしていて、それでもサンプルが合っていた。なぜ足し算引き算ではなく XOR なのか。たとえば雲をたくさん重ねた状態のビット長がコントロールできないのが不都合なのかと思った。雲のハッシュ値が 40 ビット長だとして 1000 個の雲を足し算で重ねるとざっと 50 ビットがないと状態が保持できない。では雲の最大数が決まっていてビット長が足りているなら足し算で問題ないのだろうか。むしろ状態が 40 ビットを超えると発行済みの雲のハッシュ値(単独)とのかぶりが考えられなくなるのが嬉しいのではないか、と一瞬思ったけど、それなら最初から 50 ビットのハッシュ値を配っておいて XOR で重ね合わせをするのがビットの効率的活用なのかなというところに落ち着いた次第。■D 問題。単に雲の番号を足し合わせたものを状態として持っておけば良い。ハッシュ値はいらない。重なっている層数をあわせて管理しておき、雲が1枚だけのときにだけ雲の番号の和を参照するのだから、雲1+雲2が雲3と判別不可能だろうと関係ない。……ということが復習を終えた段階でもわからないんだなあ。


2025年11月27日 (木) 20251114の続き。パスキー。これまでで一番詳しそうな記事。■「パスキー徹底解説:パスワードレスな未来への完全ガイド - ZDNET Japan」■「第1回:パスキー認証器とは何か?--パスワードレス時代へのカギ - ZDNET Japan」■パスキーという仕組みを成り立たせる独立していたりしていなかったりする4つのアクター(記事ではエンティティとされている)があるという。OS、Web ブラウザ、Web サービスやアプリ(依拠当事者/リライングパーティーと呼ばれている)と最後に認証器(オーセンティケーター)。認証機というのが見えにくい。「パスキーの世界において、オーセンティケーターとは、パスキーの公開鍵と秘密鍵という構成要素を生成・保存し、あらゆる認証セレモニーの際にそれらを取得・使用する技術を指す。Googleのパスワードマネージャーのようにウェブブラウザーに組み込まれているものもあれば、「Bitwarden」「Dashlane」「NordPass」といったサードパーティー製のBYO(Bring Your Own)型パスワードマネージャーも含まれる。また、デバイスのOSと連携したり、Trusted Platform Module(TPM)や「Secure Enclave」などのローカルセキュリティハードウェア、あるいはYubicoの「YubiKey」のような「FIDO2」準拠のローミングオーセンティケーターといった、パスワードマネージャーではないハードウェアとの組み合わせで構成されたりする場合もある。ここで重要なのは、現在のパスワードマネージャーの多くがFIDO2準拠のオーセンティケーターである一方で、全ての認証器がパスワードマネージャーであるとは限らないという点である。例えば、YubiKeyは認証器ではあるが、パスワードマネージャーではない。また、「オーセンティケーター」という言葉の意味は、テクノロジーベンダーやその顧客によって異なる場合があることにも注意が必要だ。」 たとえば Bitwarden がそのひとつだという。Google や Microsoft とどちらがマシかはわからない。どれも選びたくない選ばされたくない雰囲気。


2025年11月25日 (火) 近所のスーパーで一本満足バーの売り場がここ2、3週間欠品のままで、さすがに異常事態なのかなと思ったときにうろ覚えのメーカー名と符合するニュースがあったことに気がついた。システム障害からの正常化がまだみたい?


2025年11月23日 (日) [AtCoder] 昨日は AtCoder Beginner Contest 433 があった。ABCD 4完だけど意外に耐えた。それで耐えられるレベルが情けない話。■A 問題 Happy Birthday! 4。最難関 A 問題来ました。なんもわからん。どっちが大きくてどっちが小さくてどっちがいくつずつ増えてどっちが早く大きくなるのか、なんもわからん。全探索でも許されるのはわかる。でも十分な範囲がなんも見積もれない。実行時間で区切れば 1000 万まではいける。でも 10000 で十分な雰囲気(!)も感じられる。ふわふわといつまでも雲を掴んでもいられないので6分時点でとりあえず投げて運を天に任せた。■B 問題 Nearest Taller。N が 20 万なら考えるけど N が 100 なので考えずに全探索。なんで A 問題がこうじゃないんだ。■C 問題 1122 Substring 2。1 と 2 の境界を全探索して、左右を調べる。高々全長の2倍しか調べないので愚直にやって大丈夫。■D 問題 183183。x と y の mod M が足してゼロか M なら f(x,y) が M の倍数。x の mod M がそのままの値ではない。y の桁数によって 1 から 10 桁まで持ち上げられる。10 から 100 億を x に掛けたものの mod を取る必要があるということ。数列 A の要素ごとに高々 10 通りの mod M なので予め集計しておく。■E 問題 Max Matrix 2。時間を使い過ぎないようにうまく情報を持って順番にマス目を埋めていくだけだと思った。最初の実装を完成させるのに1時間と6分かかった。時間を使い過ぎないようにうまくやれはしたけど、別の意味で時間を使い過ぎているし、WA が出てしまった。提出 #71168194 (WA×4/AC×26)。残り6分なのでランダムケースで考え漏らしやバグを見つけることもできず終了。F 問題は読んでいない。■■■精進。E 問題。WA だった最初の提出 #71168194 に対して必ず Yes となるランダム入力を与えてみたところ問題なく答えが出せていた。だから早期に No と答えている 33 行目が誤っているのかと疑って取り除いてみた。提出 #71212471 (WA×4)。結果に変化なし。では No と答えるべきところで No と答えられていないことが疑われる。ちょっとひらめいて、必ず Yes となるランダムケースの、X 数列の要素のひとつをインクリメントしてみた。つまりある行の本当の最大値よりも1つ大きい値が最大値として指定されているわけで、行列を埋めるに際しては寛容な制約となるが、もちろん制約を満たす最大値を埋めることはできないはずだ(必ずできないかはわからない)。提出 #71212530 (AC)。何をやって AC になったかというと、答えらしき行列を埋めた後で、事後的に各行各列の最大値が入力の X,Y 数列を満たしているかを確かめている。悔しいなあ。やるべきことはできていたし、実行時間にも余裕があったのに、検算をする慎重さが足りなかった。実装に時間をかけすぎていたことも敗因。大きい値から埋める派と小さい値から埋める派の2つを観測したけども、自分は大きい値から埋めました。小さい値から埋めるときに何を考えるのかはわかりません。「小さい値から行列の要素を埋めていけばよいです。行と列の片方にその値があればどちらかを適当に埋めていけばいいのですが、両方にある場合は交わった要素をその値にしなければなりません。 また、それ以外のその値以下で使われていない最大の値にすればよいです。それにはBTreeSetを使って要素を[first, last)の区間にすればよいです。結果的に区間が隣り合えば結合します」 わかりません。


2025年11月20日 (木) ScanSnap S1500 を処分することにした。純正の消耗部品はもう手に入らないし、消耗部品でない紙送りローラー(4つ)が溶けてスキャンに支障が出ている。ネットで見かけたシリコンチューブを使った方法も試したけど、一時的な延命にしかならなかったし、安定しなかった。紙送りが差し支えると 1 mm の帯が 5 mm、5 cm に引き延ばされたような縦長の画像が出力される。あからさまだとすぐにスキャンし直せるけどあとで読んでいるときに1ページ2ページ横一線に入ったにじみに気がついてももう紙束がなかったりする。エラー率は 20 % から 1 % のあいだくらい。ベストな状態でもゼロにはならなかったし、ベストな状態が何か月も続くわけでもなかった。シリコンチューブはまだまだ十分な長さが残っているけども。あとは紙を差し込んでも全く吸い込まないことが頻繁にあって、パッドとローラーとシリコンチューブの隙間で何がどうなって空回りしているのかわからない。わからないままだましだまし機嫌を伺ってスキャンしてきたのがここ数年のこと。それより以前は角川文庫の紙質を特に苦手にしていた以外はそれなりにうまくいっていた。一度セットしたらあとは放置という具合にはなかなかいかなかったけど。15 年間で 708472 枚スキャンしたらしい (ScanSnap Manager による報告)。もう十分かな。■IX2500 を買うと決めた日がたまたま IX2400 の発売日で、今日まで様子を見ていたけど待ちきれなくて IX2500 を注文した。IX2500 を IX2400 と比較したときの自分にとってのメリットは USB ケーブルが省略できるということのみだけど、販売価格差が数千円なら IX2500 が安すぎるのでそれでいい。15 年前の S1500 の購入価格が 41000 円だったのだから、昨今の物価を考えると IX2400 で5、6万円、IX2500 で7万円でも良心的価格だったと思う。これは販売価格の話。IX2500 の最安は5万円からなので安すぎる。4万でも5万でも懐には痛いし1週間様子を見てきたのではあるけども。