/ 最近 .rdf 追記 設定 本棚

脳log[2025-06-04~]



2025年06月04日 (水) 前々から予測していた危険がみごとにその通りになった。戸を開けて包丁をしまうときにね、今落とすと(先に見えている)足があぶないなとスリッパを履いてる方が安全だなと思っていたのだった。今日は靴下も履いていなかった。ゴツッと親指の付け根の骨にぶつかって皮一枚だったのが幸い。手を滑らせたこと、ぶつかったこと、当たったのが峰でなかったことが不運。回転していたし赤い筋も見えなかったので幸運を期待したのだけど。


2025年06月03日 (火) [AtCoder] 精進。ABC096-D「Five, Five Everywhere」(水 diff)。提出 #66415672 (AC / 85 Byte / 212 ms)。サンプル以外のケースが2つしかないのね。N=55 とあとはなんだろう(N=5 はサンプルにある)。解答のマジックナンバーも5だった。タイトルに偽りなし。解けてみたらこれ以外にないという感じだけど、解けない。この問題は何度も埋め損ねて残っている問題のひとつだった。N が小さいし候補となる素数の数も知れてるし、実際に組み合わせてみてフィルタするうまい方法がないかを最初は考えた。でも 50 の 5 乗に近い組み合わせは考えられない。その次に、特定の余りの組み合わせが特定の余りに限定されるということがあるなと思って、2とか3とか4の余りについて考えていた。2の余りによる分類は偶数奇数ということでほぼ意味がない。2以外の素数はすべて奇数なので。問題が5個の組み合わせでなく偶数個の組み合わせだったら、奇数を組み合わせてできあがる数は2より大きい偶数(≠素数)だということで簡単だった。次に3の余りを考えたけど、ポンコツだったのは、3で割って1余る数は必ずしも偶数ではないんですよ。3の倍数も奇数に限らない。それが偶数だ奇数だと勘違いして無駄に時間を使った。次に4。4で割った余りによる分類は偶奇偶奇と分かれるので、それで3で割った余りを勘違いしたんだろうなあ。4で割る理由は奇数の素数を2派に分けられるから。でも分けて嬉しいことはなかった。次が……。


2025年05月31日 (土) [AtCoder] 今日は AtCoder Beginner Contest 408 があった。D 問題に全部持って行かれた。全部ではないな。E と F の点数 950 点と D の点数 400 点を持って行かれた。難易度が F<E<D の順で逆転していた。■A 問題 Timeout。今日は A 問題から不調を感じていた。+0.5 秒がまじで嫌い。長老が寝る瞬間に長老は起きているのか寝ているのかという問題が生じないためであるのはわかる。目的はわかるけどそれを処理する頭がない。だから嫌い。今日はごちゃごちゃ細かいことが考えられない。■B 問題 Compression。uniq、sort. ■C 問題 Not All Covered。端から順に見ていってそこをカバーしている砲台の数を数える。■E 問題 Minimum OR Path。単純パスというのは考えなくてもいい。寄り道をして得をすることがないので。ラベルのビットには明確な序列がある。1<<k を含むラベルを使わないで済むなら、1<<k 未満のラベルはすべて使ってしまって構わない。この論法で最上位ビットから決めていく。UnionFind で 1 と N の連結非連結を確かめながら。TLE を1回出した。マスクしたウェイトに基づいて辺をソートしてから UnionFind をしたのが原因。ソートがいけない。ソートするより一辺一辺使用するかしないかを判断する線形時間の処理の方が軽い。■F 問題 Athletic。セグメント木が使えますかという問題。高橋君のいる高さは狭義単調減少なので、高さの低い方からあと何回ジャンプできるかを求めてセグメント木に乗せていく。高さが近すぎるとジャンプできないので、求めた回数をすぐにはセグメント木にセットせず、キューに入れて遅延させる。それだけ。■D 問題 Flip to Gather。ある1の島を、残す1の左端にすると決める。そうするとそこより左にある1の数だけ操作が必要。同じことを右側についても求める。左端と右端を決めたら左右の消すべき1の数と真ん中の消すべき0の数がわかる。2乗の解法は許されないからどうする。尺取り? あのですね、人間のワーキングメモリには個人差があって、自分は頭が働くときでも3段4段の処理は脳内スタックからあふれてしまう。DP をするときだって in-place で書き換えたり保持するものを前後の2系列に限ったりすることで添え字が3つ以上にならないように工夫している。というかそうする方が楽だし解きやすいので自然そうなる。1+1+1+1 = 4 ではないんです。3までは線形に増えていってもその次はスタックオーバーフローで実行が完了しないんです。こういう限界の低さをふまえて出題してもらいたい。D 問題に解けない問題を置かないでほしい。■■■A 問題。嫌いな嫌いな +0.5 秒問題。自分について理解した。たとえば問題文が「最後に肩を叩かれてから S 秒後まで長老は起きています。(最後に肩を叩かれてから) S+1 秒後には寝ています」だったらすんなり頭に入ってくる。次からこう読めばいいと理解した。S と S+1 という2つのパラメータを S というひとつの値で表すために +0.5 秒というやっかいものを導入して、「あとはわかるな」で済ませるから話がややこしくなるのだ。きっちり文章にしてくれないとわかりません。


2025年05月25日 (日) [AtCoder] 今日は AtCoder Regular Contest 198 (Div. 2)。■A 問題 I hate 1。こういうのをギャグというのだろうか。AtCoder で一発ネタを見ることってない。たとえば2を追加するとすべての奇数が追加できなくなる。一方で、2の倍数は余りが0なので追加することができる。なので S の要素は素数の倍数が良さそう? ほぼ半数を要素にできる2の倍数以上にすぐれた選択肢ってある? 問題の難しさを認識することさえできなくて過度に単純化した結果 WA を出すというのが ARC あるあるだしなあ、でも 300 点問題だしなあと数分逡巡してから(反例となる素数の組み合わせも見つからなかったので)提出して AC だった。■B 問題 Rivalry。問題を読んで具体例を確かめていくと、01100[1]2[1]0 しか作れないとわかる。2の両隣の1はオプション。0 はいくつ連続で並べてもいいので、11[1]2[1]0 で区切るイメージ。まずは消費の仕方が限られている2を消費したい。2を消費するのに十分な0の数は2と同数。これは数列が環状に循環しているから。次に1を消費したい。2の両隣の1はオプションだから、2の倍の数までは何も考えずに消費できる。余りは 11 として2の島と同様に同数の0で区切る必要がある。余りの1が奇数個の場合が面倒。2の隣の1をひとつ持って来られるなら良し。持って来られない(2がゼロ個)なら即座に No。実装ミス(A = A-B-BA -= B-B とした)と勘違い(ひとつのことを実装しているあいだにもうひとつのことが曖昧になっていくせい)で2ペナ。■本日の ARC は終了です。時間をオーバーして C 問題の実装を終わらせたけど、シャッフルした順列をソート済みに並べ替えようとすると最後の2要素が一致しない。操作対象が2要素だけだと自由度がなくていけない。1要素を加えた3要素を手で操作してなんとかできないかやってみたけどどうにも完成させられなかった。えっ? 全体の和が一致していても不可能なケースがある?(ないよね) N=2 だけでなく N=3 も場合分けが必要?


2025年05月24日 (土) [AtCoder] ABC407。死亡。E 問題、2乗の DP を、やらせてください。F 問題、2乗の解法で、勘弁してください。どちらも許されないもよう。今日は A 問題からドキドキで WJ を眺めていたし、B 問題はなんとなくで総当たりの解法を見つけただけだし、C 問題と D 問題でやっと普通にやるだけだと感じられた。そして EF で死亡。■■■驚きました。コンテスト成績証。1391 水パフォで +8 レートだった。これで上がる自分のレベルの低さに驚きました。


2025年05月22日 (木) プログラマーの性格が悪く見えるのは日常生活をRFCやソースコードとして解釈しているから説 - hitode909の日記」■「日常会話、RFC説」おもしろいなあ。俺も言いたいことがあるよ。結果に関して明らかに MUST を要求してきてるのに、コストに注目して「それは MUST ですか」って聞くとそうは言っていない (MUST じゃない) (MAY だ) っていう人が、だけど要求は下げない人が、いるんだよ。「自主~」を要求するみたいな国はそういう人間でできています。■■■「68行目にごちゃごちゃやってますが、これはNと111...(下から数えて0埋めしたい桁数)...1を&演算してNの下digit_from_bottom桁を抜き出し、Nからこれを引いて下digit_from_bottom桁を0埋めした数字です。もっとスマートにやる計算方法があるのでしょうか? 誰か教えてください」 自分だったら masked_max_m = max>>digit_from_bottom<<digit_from_bottom って書くかなあ。特に罠もないと思う。符号は罠にならないし(非負だよね?)、シフト数の罠(明らかなシフトしすぎは未定義)は書き方によらないし (Rust の罠は知らないよ)。あと、20250517 に書き足したことだけど、以下と未満の差を埋めるのは n に予め1を足しておくだけでいいみたい?


2025年05月18日 (日) Xperiaの名がなかったのはなぜだろうか? その主な要因として挙げられるのが、激化する価格競争で十分に優位に立てなかったことだ。特に円安が追い風となり、Xperiaのハイエンドモデルの価格は年々高価になり、競合のAndroidメーカーが次々とコストパフォーマンスの高いモデルを市場に投入する中で、優位性を示せなかった」■「円安が追い風」 円安はネガティブ材料なのだから、向かい風や逆風がふさわしい。関係あるようなないような話。真逆と書かれていればそれが作家の当て字でも早い者勝ちルールでマサカと読むことにしている。■■■「大学院の講義が英語化された結果、日本人学生はリスニングができないので話を聞かずレジュメを眺め、一部積極的な留学生がたまに質問するようなスタイルになった - Togetter [トゥギャッター]」■相変わらず趣旨には触れないんだけど、~が原因となってみたいな意味の「ひいては」を漢字にすると「延いては」になるみたい。意味を考えるとまあそうかなという感じ。延長線上に何があるかを示すという意味で。「引く」という動詞があまりにもたくさんの意味を持っていて、「引いては」と変換候補にも出てくるから、うっかり選ぶこともあるかな。(それがなんか違う気がしたので ATOK で辞書を引いた)


2025年05月17日 (土) [AtCoder] 今日はパナソニックグループ プログラミングコンテスト2025(ABC406)があった。■A 問題 Not Acceptable。やります。比較方法はいろいろ。配列で比較してもいいし、3回比較してもいいし、単位を揃えて比較してもいい。■B 問題 Product Calculator。どうやって桁数を知るか。Integer#digits を使ったけど、10**K と比較するのが無駄がなかったみたい。他の人の提出で知った。■C 問題 ~。にょろ。each_cons(3) で極大値極小値の座標をメモして、each_cons(4) でその座標4つから答えを数えた。たとえば、i<j<k<l が連続する4つの極大値極小値の座標だとすると、左端の候補が i から j-1 まで。右端の候補が k+1 から l まで。掛け合わせたものが j,k の位置に山と谷を持つ連続部分列の数。これでサンプル3の答えが過大になって困ってしまった。デバッグプリントで確かめてもバグがなかったので問題を読み直してみると、「A1​<A2​ である」という条件を忘れていた。P[i]<P[j] を確かめて解決。ところで、波ダッシュにはこういう話題がある。「UnicodeのWAVE DASH例示字形が、25年ぶりに修正された理由」。自分は何事も雰囲気でいい加減な人間なので、チルダも波ダッシュも全角チルダも同じようなものだと思ってるし、波が上がってから下がるかも下がってから上がるかも全く区別するつもりがない(できない)。この問題もそうであったらデバッグのための5分10分が節約できたのになあ。■D 問題 Garbage Removal。列の情報と行の情報を分けて管理する。罠がいくつか。グリッドが H 行 W 列。(i,j) は上から i 行目で左から j 列目のマス。(Xi,Yi) は i 番目のゴミの座標。説明がまわりくどくて無駄に文字が増えてるうえにその文字がかぶってる。(i,j) の説明は省いて (Xi,Yi) が上から Xi 行目で左から Yi 列目のマスだって説明すればいいじゃない。X と H、Y と W の対応もいやらしい。管理する情報はゴミの行から列、列から行と、すでに片付けられた行と列。同じ行(列)を何度も片付けようとすると TLE になるので(なったので)、片付け済みかどうかをまずチェックする。片付け済みフラグを管理する代わりに行から列、列から行のデータを削除可能な集合にして、リンクさせて管理するのが素直な解法だったっぽい? 最初にそれを配列にしてしまったから対になるデータを同期するのが無理だと思ったんだよね。■E 問題 Popcount Sum 3。たとえば問題が 0b1111111111 以下の整数 x についてだったら数えやすい。実際に与えられる N はそうではない。過去問を解くときに十分に苦しんできたので、どうすれば漏れなく重複なく数えられるかは知っている。倒すビットを1つ選ぶ。それより上位のビットは N のものをそのまま維持し、それより下位のビットは 00...00 から 11...11 まで好きに選んでも N より小さくなる。固定された上位のビットと好きに選べる下位のビットの組み合わせで答えを数える。「N 以下」なのでビットを1つも倒さないケースも忘れず勘定に入れる。その方法だけど、N のケースを個別に数えるんでなく、N に予め1を足しておくだけで良かったっぽい?(「例の20は1足して21にすると考えやすいです」) ビット表現に即して考えているときにその表すところである数に意識を切り替えるのは難しい。ところで、数えるものは個数ではなかったんだよね。サンプルが合わないから読み返したら太字で総和って書いてあった。ちょっとひとひねりという感じなので、冷静にひと手間かければ個数を総和に変換できる。ひとひねりでてきめんにやられるのが自分ですけどね。ひと手間というのは、好きに選ぶ各ビットの寄与(1少ない桁数から1少ない1のビットを選ぶ場合の数)を考えること。■F 問題 Compare Tree Weights。HLD なのかな、平方分割チックに木をブロックに分割するのかなと考えるもまとまらなかった。スター型の木と直線の木を同時にうまく扱う方法がわからなかった。X でオイラーツアーと BIT だと複数見かけたけど、まだピンと来ていない。■G 問題 Travelling Salesman Problem。ABC273-F「Hammer 2」みたいな雰囲気を感じます。考える意味のない無駄な動きを除外してうまくやりたいけど、うまい動きがどういうものかはっきりしない。ちなみに ABC273 は3年前のパナソニックのコンテストでした。偶然ではないとしたら本当に似た問題なのだろうか。Hammer 2 は右左右左と往復を繰り返すことで効率良く解ける問題だった。制限時間が3秒だけど Ruby で 62 ms で解ける。……むしろ今日の C 問題?■■■精進。F 問題。提出 #65938315 (AC / 976 Byte / 1291 ms)。ひと晩寝るまで何がわからなかったか。ある区間の和を得るには端からの累積和の差を取るという、BIT(累積和)の使い方を忘れていた。オイラーツアーで木の頂点を DFS の行きがけ順に並べたら、ある頂点の子孫がある区間に連続して並ぶ。では子孫の重さの和を得るには、というときにどういう操作をするのかがわかっていなかった。なんでわからなくなるのかがわからなくもない。頂点を一列に並べてそれを BIT に乗せるとき、列に木の構造を見るばかりに BIT の各要素に過剰に意味を見つけようとしてしまうのだろう。だけど累積和の各値に木の構造を反映した意味はありません。差分を取って初めて意味が出てくる。だけど意味がわからないから差分を取るところまで行けなかった。数弱ですからね、すべて意味と具体で納得しながらでないと前に進めない。


2025年05月10日 (土) [AtCoder] 今日は AtCoder Beginner Contest 405(Promotion of AtCoder Career Design DAY)があった。結果はまあまあ。ペナルティ2つがしょうもない。■A 問題 Is it rated?。こういうのは仕様をそのまま書きます。仕様はコードではなくデータで表現するのがおすすめ。コードはなんでもできすぎる。■B 問題 Not All。Array#tally で種類数を管理しながらシミュレートした。■C 問題 Sum of Product。すべての組み合わせの積の和。Ai に対して Aj (j=i+1,...,N) の和を掛ける。■D 問題 Escape Route。あまりにも実装が下手だった。全部で 25 分かけて TLE も1回出した。グリッド BFS を書くのが下手(そんなことある? 驚きました)。この TLE だけど(#65661930)、31 行目を分解すると倍速くなった(#65666427)。グリッドの移動部分もアンローリングするとさらに倍速くなった(#65668293)。手を抜いたわけではないのです。早過ぎる最適化は悪なのです。■E 問題 Fruit Lineup。4つの果物を並べる3つのルール。きれいに整理できそうでできなくてでもやっぱりできた。バナナとブドウを混ぜて並べたあとで、最も左のブドウの位置に応じて、ブドウの左にあるバナナとリンゴのあいだにオレンジを並べる。■F 問題 Chord Crossing。ABC402-D Line Crossing で多く観察された誤読バージョンが期待に応えて登場。今回も誤読しました。時間をオーバーしながらとりあえず実装を終えたけどサンプル2が合わない。ノートをひっぱり出してきて図示して気がついたのだけど、線分どうしが共有点を持たないといって、そのありようにはバリエーションがある。2と4、6と8、10 と 12 を結ぶ3本の線分もたしかに共有点を持っていないが、こんなケースを全く想定していなかった。奇数の頂点を2つうまく選ぶことですべての線分を必ず貫くことができると想定していたのだけど、それは間違いだった。じゃあクエリの区間のあいだに出入りする線分をうまく数えてなんとかしたいね。最初はこの線で考えていたんだけど、すべての線分を平行に並べ直せるならより簡単に解けると思って、でも勘違いだったんだよなあ。■精進。F 問題。提出 #65700291 (AC)。クエリ区間のあいだに外から入って来る線分と外に出て行く線分を数えて、区間の内部で出入りが完結する線分を無視するために、何を管理すればうまくいくか。ABC402-D を誤読したときに誤読したまま解答までたどりついていれば今日は考える必要がなかった。残念ながらそうではなかったので、今日たっぷり考えさせられることになった。クエリ区間が始まるときに、すでに頂点を出発していてクエリ区間中に着地する予定の線分を BIT で数える。クエリ区間が終了するときには、頂点を出発していてまだ着地していない線分のうち、クエリ区間開始時にはまだ出発していなかったものを数える。これだけのことなんだけど、何をメモしてそれをどう足し引きするかということがものすごくややこしかった。■時間内に解いている hmmnrst さんの提出 #65685391。セグメント木を使ったあまりにもすっきりした解答。自分の頭の中のこんがらかり具合を反映して、ぐだぐだと順を追ってあれを数えこれをメモしてやっとのことで答えを出している解答との差よ。


2025年05月03日 (土) [AtCoder] 今日は AtCoder Beginner Contest 404(Promotion for Engineer Guild)があった。不本意な結果なので言葉が少なくなります。■A 問題 Not Found。Ruby の Array には集合演算が混じっている。Array#- で残ったものをどれでも出力する。■B 問題 Grid Rotation。回転操作は transpose と reverse をテキトーに組み合わせて実現できることを知っている。テキトーに試してみてどんな具合か出力してみてそれが何回右回転したものかを目視で確認する。あとはそれが T とどれだけ一致しているかしていないか数える。■C 問題 Cycle Graph?。スマートにやろうとかテキトーにやろうとすると WA が出るのを知っています。スマートにっていうのは頂点数と辺の数が一致していることを確かめるだとか、頂点の出現回数がどれもちょうど2回であることを確かめるだとか。入力が単純無向グラフであることで多重辺や自己辺といった罠はあらかじめ取り除かれているけど、グラフが複数のサイクルに分かれている場合が罠になる。再帰関数できっちり全頂点を辿れるかを確かめる。きっちりできるかどうかはがんばりしだい。■D 問題 Goin' to the Zoo。100 ms オーバーで TLE だった。こうなるとましな新しい解法を考えることはできなくて、小手先の試行錯誤でなんとかする頭しかない。E 問題のあとでやろうとして帰って来られなかった。■E 問題 Bowls and Beans。2000 ビットのビットフラグで状態を管理することは TLE になるのでできない。できないけど他に思いつかなかった。どうすれば良かったか。茶碗には2種類しかない。最初から豆が入っていた茶碗と、入っていなかった茶碗。あとから豆を入れられた茶碗というものをとりわけて考えない。茶碗1から順番に考えていく。左側にある C 個の茶碗を参照して、現在の茶碗に豆があるとすると最少何回の操作を追加することになるかを記録していく。そのとき、参照した茶碗が元から豆が入っていた茶碗なら、その茶碗に記録されている操作回数は無視して1回が記録対象になる。もともと豆が入っていなかった茶碗なら、その茶碗に記録されている操作回数+1が記録対象になる。コンテスト中に引っかかっていて解決できなかったポイントがここにある。元は豆が入っていなかった茶碗が右側にある豆を茶碗0に移動する際の中継点になるとき、もちろん複数の茶碗から豆を集めてからまとめて操作をして操作回数を節約したいと考える。さっきのやり方では操作回数を重複して数えてしまうのではないか。そうはならない。現在の茶碗と参照する豆なし茶碗のあいだに豆入り茶碗が存在しているとき、豆入り茶碗が常に優れた参照先になる。ここまではいい。あいだに豆なし茶碗が存在するとき、それが中継点への中継点として役に立つか無視されるかはわからないけど、重複を心配する必要はない。だってどちらの豆なし茶碗もまだ実際には操作回数が答えにカウントされていないのだから。豆なし茶碗の操作回数は豆あり茶碗から参照された時点で初めて答えに寄与し、そのときから参照した豆あり茶碗が参照された豆なし茶碗より優れた参照先になるので、操作回数の重複カウントが起こらない。そういう関係が見えなかったのでコンテスト中はビットフラグで全パターンを網羅しようとして TLE 解しか書けなかったのだった。提出 #65480897 (AC)。■F 問題 Lost and Pound。残りの試行回数と現在の当たり回数しだいでは1つのボタンに全ベットするしかない状況もあるよね。後ろ向きに全パターンを網羅して埋めていくんだろうか。TKKM≦810000 が微妙に小さくて何か見落としてないか不安。ボタンの選び方が簡単に決まらないのかな。30 の選択肢を 1 から 30 個のボタンにどう分配するか。ボタン当たりの賭け数の比率にしか意味がない。30、29+1、28+2、28+1+1、……。これは何通り? 状態数が TK で遷移が KM かと思ったけど、遷移の M が M の関数だった。■F 問題。提出 #65484558 (WA×18/TLE×1/AC×35)。サンプル3を合わせるために T 回の試行の各回で k=0 から勝ち抜ける場合を特別扱いしているけど、3分の1ほど WA がある。その他の k も特別扱いすればいいのだろうか。頭の中の整理が追いつかなくてどうやるのかわからないけど。……経路の復元をしますか? すでに TLE が1個出てるのにまだ手をかけますか。■■■F 問題。提出 #65513292 (AC / 1925 ms)。えっとね、サンプル3の合わせ方が間違っていた。後ろ向きの遷移経路の復元ということで順方向の遷移をたどっていて気がついたんだけど、答えが合わない原因は、当たりの数が1増える遷移、2増える遷移、3増える……ばかり考えていて、当たりの数が増えない遷移を考え忘れていたこと。それを忘れたまま変なこと(最初の提出の 34-37 行目)をしてよくも3分の2ほど答えが合ったものだと逆に驚く。そこをちゃんとやれば最初に考えた構成で素直に答えが出た。後ろ向きの遷移を T 回繰り返したあとで k=0 の位置に答えがある。何種類のボタンに何回ずつ賭けるかという配分のしかたは前半部分でプログラム的に求めている。再帰関数で愚直に。TLE×1 の対策は Hash#to_a をしただけ。t/N を事前に計算して t の値に含めておく案もあったけど必要なかった。あとは分配のしかたを埋め込むとか?■■■E 問題。線形時間で解けると読んだので考えた。提出 #65552947 (AC / 124 ms / 49 ms)。124 ms が最初のテストケースに固有の特異な値だとして無視するとその次に遅いのが 49 ms。いいんじゃないでしょうか。C の値に基づいて次の最善手を範囲取得すると log が付いたり2乗になったりする。後ろから見ていくとうまくいく。そのためには ref1, ref2 という2つの変数を蓄えておくだけでよかった。少しだけがっかりするお知らせは、次の一手を範囲取得するのでも、適時(Ai=1 のとき)参照する配列を空にするようにすると 56 ms までにおさまるということ (#65551430)。考えて字数を費やして複雑にした甲斐がない。


2025年05月02日 (金) [Win11] 以前にモニターをスタンバイ状態にすると勝手にモダンスタンバイ(S0)状態になってバッチファイルの実行が中断してしまう不都合があると書いた>20250227。PC にしばらくやっていてほしい作業があって、でも自分は別のことをするので画面を消して消費電力を 45 ワット節約したいけど、モニタの電源のオンオフに反応の悪い物理スイッチや反応の悪いリモコンを使いたくないとき、Windows 11 ではロック(Win+L)すればいいのだとわかった。スマホのロック画面と同じく Windows 11 のロック画面もモニタを自動消灯する時間の設定とは関係なくすぐに消灯する。画面をオフにするのにスクリプトを書かなければいけなかった以前より良くなっているのではないか。■ひとつ上げたから誤解を生じないように書くのだけど、HDD の電源を切るまでの時間の初期設定が1分なの狂ってると思う。何をするにしてもスピンアップの時間を待たされるし、HDD の寿命が心配にもなる。くわえて、スリープ(S0, 電源ランプ点滅)にしていても、わりと頻繁に HDD がスピンアップする音が聞こえてくるというのもある。画面は暗いままだけど電源ランプは点滅していたものが点灯している。人間は操作していないし部屋にもいなかった。これがつまり S1 や S3 とは違う S0 スリープなのかなと思ってるけど、何をしてるかわからないしまったく望んでもいない動作なのは間違いない。


2025年04月27日 (日) [AtCoder] 今日は AtCoder Beginner Contest 403(Promotion of AtCoder Career Design DAY)があった。F のデバッグのためにあと5分あれば時間内に通っていた。無念。■A 問題 Odd Position Sum。やります。最近古い ABC の A 問題 B 問題を埋める(ことに意味を付与する)ために Haskell を書いてるんだけど(書いてるだけでまだ提出していない)、これが実に難しい。「やります」じゃないんだよ。七転八倒してやっとなんとかなるレベル。C 問題にはまだまだ手が出ない。Ruby だから所要1分半。■B 問題 Four Hidden。正規表現でうまくできないかなと思って書いたけど、無駄に高機能なものを持ち出しただけに終わった。所要4分。■C 問題 403 Forbidden。ABC401 から続く HTTP ステータスコード。閲覧権限をメモしておいて答える。「すべてのページ」の閲覧権限を別枠で持たなければいけないことに注意する。全ページ個別に閲覧権限を付与してまわってはいけない。所要6分。■D 問題 Forbidden Difference。配点が +25 点なだけあってきっちり WA を出した。D で割った余りでグループ分けをして D で割った商の連続についてそれぞれどういう間引き方をするのが得かを考えた。何を勘違いして WA を出したか。偶数番目を間引くか奇数番目を間引くかの2択だと思ったんだよね(A 問題がこれへの布石だったならあまりにも策士)。D=1 で A.uniq=1,2,3,4,5 であるとき、B.uniq=1,3,5 か B.uniq=2,4 が答えの候補のすべてだと思ったんだけど、実は B.uniq=1,4 も B.uniq=2,5 も答えになり得る。何が答えになるかは 1,2,3,4,5 それぞれの重複度による。DP をしないといけなかった。感想を見てると D=0 のとき %D/D で RE を出す罠もあったらしい。でも問題文にしっかり「非負整数 D」って書いてあるよ。MEX が典型なんだけど、否定で定義されると理解が1ステップどころか2ステップも3ステップも遅れるので、今日も「非負整数……非負…非負……ゼロ以上ってことね」と理解に時間を費やしていたおかげで、%D を書くときにすっと場合分けができた。所要 20 分+1ペナ。■E 問題 Forbidden Prefix。スマートには解けなかった。結構力押し。クエリを先読みして X の集合と Y の集合をソートしておく。X の各要素について、どの Y 要素の接頭辞になっているかという範囲を二分探索で求めておく(演算は普通に String#<=String#start_with?)。ここまでが事前準備で、クエリに沿って削除された Y 集合の範囲と、まだ削除されていない Y 集合の要素を2つの BIT で管理しながら答えていった。所要 31 分。■F 問題 Shortest One Formula1111111111 の構成方法は確定している。あとは1から N までボトムアップで最短の積と最短の和を構成していった。積と和を区別しているので積と和を構成するにあたり括弧の要不要の判断が簡単にできる。また、積は a*b、和は a+b という2項演算だけを考えた。例えば a+b+c という形が最短になるというなら、それは d(=a+b) の最短と c の最短の2項を組み合わせるなどして構成することができる。和の構成は n/2 通りの総当たり。積の構成は√n通りの総当たり。終了1分前のこの提出 #65289442 の何が WA の原因か。24 行目の文字列リテラルで括弧の付け方を間違えている。それだけ! くやちい! 5分オーバーで AC (#65291201)。所要 43 分。■結果出た。コンテスト成績証。690 番 1665 青パフォ。F 問題がぎりぎりで通っていても 100 番 100 パフォ上がるくらいの差みたい? E を通した時点で 40 分弱残していたのがわりと早かったのだな。じゃあ時間外でも F が解けたということが素直に喜べる。■■■F 問題。最初から積の最短と和の最短を持とうとしていたわけではない。必要がなければわざわざ分けたりはしない。最初は最短の文字列を検索して + があれば括弧で括って掛け算に利用したり、括弧なしで利用したりしようとしていた。でも (1+1)*(1+1) だったら + があるけど括弧なしで掛け算に利用できる。パースする? それは明らかな無駄。文字列ではなく和クラスと積クラスをネストさせて最後に文字列化するのがいいでしょう。もうひとつ。ある数を積で表す方法と和で表す方法の2通りがあるとき、括弧で包む(くるむ)必要がない積の形式の方は和の形式の最短より1つ長くても積を構成する場合に限って有利な立場にある。こんな感じで2通りの意味で積の最短と和の最短を分けたいなという気持ちになる。それでうまくいった。■■■E 問題。Trie っぽく解き直し。提出 #65384945 (AC / 534 Byte / 1885 ms)。BIT 解の方が (1711 Byte / 578 ms / 932996 KB) だから、短いけどかなり遅くなった。再帰関数で Enumerable#group_by を呼ぶのがぜいたくなのだろうか。なにげにメモリ消費 900 MB がやばいね。木を再帰的に下降しながらその部分木の接頭辞となっているクエリ番号のうちもっとも小さい(早い)ものをメモしていった。そうすると Y 集合に属する文字列が見つかったとき、その文字列を答えに数えられるクエリの範囲が求まる。Ruby での提出を眺めると、ちゃんと Trie が扱えている人たちは 500 ms 台に収めているらしい。


2025年04月26日 (土) 留学生の院生に「『お化け』って『お化けがある』ですか『お化けがいる』ですか」と聞かれたので、「お化けは自分で動けるので『いる』」と答えると、「じゃあ、ぬいぐるみは?」難しい質問だ…… - Togetter [トゥギャッター]」■コメントになかったのでここに書くけど、お化けは「出る」としか聞いたことがない。無理に「ある」「いる」から択一することに意味があるのだろうか。