/ 最近 .rdf 追記 設定 本棚

脳log[2025-03-01~]



2025年03月01日 (土) [AtCoder] 今日は AtCoder Beginner Contest 395 があった。自分のすべての提出コンテスト成績証。F まで典型度が高く簡単でした。G はとりあえずワーシャルフロイド法で全点間距離を求めてから再帰関数で木を作って最小コストを求めてみた。サンプルの1は合う。サンプルの2は答えが合うものも、答えが大きすぎるものもある。わからない。PC の時計が1分近く遅れていてコンテストに遅刻しました。それから、自分はいつも G 問題を開いて提出言語を Ruby に変更してから他の A から F の問題を開いている。そうすると A から F の提出言語が最初から Ruby になっているし、タブの並びが A から G まで順番になるので具合がいいのだけど、今日は G 問題の問題ページに提出欄がなかった。新しい PC だからブラウザの設定が違うだろうからと外部スクリプトを順番に許可してみたりしていたのだけど、なんと今日の G 問題にはもとから提出欄がなかったのだった(提出タブから提出することはできます)。「質問 - ABC395」。さらに無駄な時間を使ってしまったけど、逆に肩の力が抜けた面もある。■A 問題 Strictly Increasing? Enumerable#each_cons で素直に判定した。何をもって「素直」とするかは判断が分かれるところ。適切な初期値を補って N 回判定を行うことを自分は素直ではないと考えたけど、N=1 の場合に each_cons(2) が何を返すか一瞬の判断を要するところが素直ではないという考えもあるだろう。■B 問題 Make Target。B 問題なりの配慮だったのだろうか、冒頭からこれ「以下のような N×N の模様を作成してください 」。ABC375-C Spiral Rotation は難しすぎて解けなかったもんね。今日は出力例を見て見たまんま実装した。■C 問題 Shortest Duplicate Subarray。同じ値の最小間隔が答え。ペナルティが出ていてびっくりしたんだけど、見たら全部 WA だった。この場合のデバッグはむしろ簡単で、スクリプトを2回貼り付けていたのが原因だった。さらに言えば原因は Firefox と MS-IME にある。(バージョンアップした) Firefox は思うようにスクロールができないし、MS-IME は全角/半角の切り替えが狂っている。ATOK2009 を使い続けたかったが Windows 11 においては入力できるコントロールと入力できないコントロールが混在していて支障がある。そのうち必ずなんとかする。■D 問題 Pigeon Swap。E 問題でもよくないですか? ABC279 では F 問題が BOX でしたよ。どちらの問題も3種類のマッピングを管理して答える。■E 問題 Flip Edge。01BFS かなと思って実装を始めたけど、それだと手戻りというか上書き更新というか、何度もグラフ全体をなめさせられる気がしたのでダイクストラ法に落ち着いた。頂点を倍加した1つのグラフでやるか2つのグラフを並べてやるかで迷ったけど、慣れた方でやった。■F 問題 Smooth Occlusion。歯は伸ばすことができないので大きすぎる H は答えにならない。逆に全部削ればいいのでゼロは必ず答えになる。コストと H は比例している。二分探索で H を決め打ってから、取りうる上の歯の長さの範囲を前から順に求めていった。空でない範囲が得られる最大の H がコストを最小化する。他の人の提出を見るに、実は二分探索はいらなかったらしい。■G 問題 Minimum Steiner Tree 2。1 から K と s, t 以外の頂点が交差点になるケースに対応できていないことが寝る前に分かった。ではどうするか、わからない。


2025年02月28日 (金) ジュンク堂書店オンラインがサービスを終了し、会員情報を引き継いだ honto が紙の本の取り扱いをやめ、まんが王に救いを求めたらあっという間にこの事態(まんが王倶楽部-MANGAOH CLUB-[ニュース] 【重要】成人向け作品の取り扱い中止について)。エロ以外のマンガと一部の小説しか取り扱いがないとなると注文できるものが限られすぎる。ならばとかつて店頭受け取りにつかっていた e-hon がいつの間にか始めていた宅配を併用し始めたのだけど、今月注文して届いたエロマンガ(複数)の存在が抹消されていることに気が付いたのが今日(3月1日)。注文履歴から本のページへのリンクが切れているし、以前はページがあった新刊も存在しないことになっている。新聞では書店を救おうという新聞紙・出版社・議員の動きが報じられているが、事態は切迫しています。エロの危機。いまさら本屋や紙の本を救おうという動きには乗りきれないんだけど、エロを排除しない決済手段や流通プラットフォームがあるべきだし、その点で紙の本と実店舗には信頼がある。今日初めて紀伊國屋書店ウェブストアにアカウントを作って注文をした。


2025年02月27日 (木) [Win11] モニターをコマンドでオフにしたい需要がある。モニターの電源スイッチを触らずに。SC_MONITORPOWER というウィンドウメッセージがある。かつては Ruby で書いたけど、今だと PowersShell を使ってショートカットファイルにワンライナーを書いてできるらしい。「PCの画面をオフにするショートカットつくってみた #Windows - Qiita」。ここからが本題。なんでモニターの電源がオフになると実行してるバッチが中断してるんですか? バッチを中断したければ Pause ボタンを押すかスリープするかするんで、モニターをオフにするときというのは、モニターをオフにしたいときなんですよ! 電源ランプが点滅してるから正真正銘スリープしてるんだよな。これはつまりカバーを閉じたときにスリープする設定をなぞっているということか? そんな設定も閉じるカバーもないけども、ノート PC のパーツを使ったミニ PC ではある。■[Win11] 起動直後は普通に使えるし、しばらくしても他のプログラムは正常に動作しているのだけど、エクスプローラーと設定アプリがフリーズするようになる。画面が真っ白でフォルダの中身が表示できない。ドライブの右クリックメニューが出ない。設定は選択により状況がまちまちで、ホームが表示されるまでの待ち時間が非常に長く、アカウントについてはヘルプを表示のリンクしか表示されない。検索設定のリンクが機能していない。他の設定は表示される。Windows Search というサービスを無効にしたら解消した。すべてがまともに応答している。何十万という検索インデックスが良くなかったらしい。できないことをやろうとするなよ。Thunderbird も 1.5 GB くらいのサイズの検索インデックス(global-messages-db.squlite)を扱いかねているみたいだったのでグローバル検索をオフにしたのだった。できないことをやろうとするなよ。ちなみに Thunderbird はそれでも設定画面が応答せず新着メールの受信が 10 分以上まったく完了しない状態が続いたので「Windows11でThunderbirdが度々フリーズするトラブル - Win11ラボ」にしたがってバージョンを 60 に下げてから 91 まで上げたのだった。91 ではすべてがまともに応答しているし、受信ボタンはアカウントを選んで受信することができる。最新の Thunderbird は受信ボタンに▼がなく、押しても2段階認証のコードを有効期限内に受信することができず、新着フィードはありませんというメッセージを表示するだけの無能だった。あることがわかっている新着メールを受信する前にフィードを調べるお前は何者か。ついこのまえ Vista での最高バージョンである 52.9.1 から最新の 128 まで何ステップもかけてアップデートしたところなのに、すぐに 60 まで下げることになるとはね。Supernova ってのはあれか、Thunderbird が爆散して消えるという行く末を見据えた命名か。■[Win11] これはデスクトップウィンドウマネージャーが悪いのだろうか。ウィンドウのフレームを隠してるよね。フチなしに見せたいがために存在しているフレームを隠している。その結果、ウィンドウの枠をつかんでリサイズしようとすると、(くう)をつかまされることになる。枠線を狙っても空振りするが、枠の外の空間には見えないボーダーが存在していてそこに判定がある。視覚を欺かれている状態と、枠が細くて狙いがつけにくい場合と、どちらがなお悪いだろう。どちらも悪いが感覚を狂わせる方がより(たち)が悪いと思う。■■■モダンスタンバイという用語を仕入れてきた。S0 がそれに相当するらしい。それを持ち上げるために従来の S3 スリープのネガが強調されすぎているように思う。MSI 990FX-GD80 というマザーボードと Windows Vista では S3 スリープで数ワットしか消費せず、復帰にかかるのは2秒未満、正確な時間はモニタの復帰が2秒程度かかるためにわからない、という状態だった。それがモダンスタンバイ(S0)になってどうなったか。ストアアプリをスリープ中に動かすためにそれほど消費電力が減らず、一方で画面をオフにしたいだけの時にバッチの実行が中断されるようになった。自分にとってモダンスタンバイは消費電力が大きく電源断への備えがなく画面だけを切ることができなくなり応答速度を改善する余地はもとからなかったためにメリットに数えられない。デスクトップ機にはハイブリッドスリープが良かった。今は移行に3秒、復帰に 30 秒かかる休止状態を使っている。スタートメニューの電源ボタンがマウスであってもキーボードであっても遠く、押してからも選択を要求するから、物理ボタンに手を伸ばしている。億劫だがそれが一番ましだから手を伸ばしている。Win、→ の2ステップだった Vista に比べて Win+X、U、H の4キーはせせこましい指の動きが要求されることもあっていかにも面倒。それで物理ボタンが比較すると一番近いのだが、それほど近くはない。


2025年02月26日 (水) [COSMOS][UM870] svn リポジトリの移動に苦労している。原因が長年にわたり度重なったブルースクリーンにあるのはわかってるんだけど、ホットコピーを作成しようとすると revprop フォルダにある連番のファイルがところどころ飛んでいてエラーになる。幸いにも足りないいくつかのコミット番号で空のファイルを作ってやりすごすことができたのだけど、次はコミットデータが連続して2、30コミット分飛んでいた。ここらでホットコピーをあきらめてダンプファイルからの復元に切り替えた。説明によればホットコピーと違いコミット以外のもの、フックなどのリポジトリ関連設定が失われるらしいが、どのみちそんなものは使っていない。ところが最新のダンプファイルもやはり同じ2、30のコミットが欠けている。このダンプファイルというのは毎日 1000 コミット単位でファイルを分けてインクリメンタルに圧縮ファイルに追加しているもの。そしてときどきは圧縮ファイルをリネームして脇へどけて、イチから書き出されるようにしている。ということはどういうことか。1つ古い圧縮ファイルの中には欠けている2、30コミットを含む完全な 1000 コミット分のダンプファイルが含まれていた。ここからが難しいところ。最新の圧縮ファイルには 181968 コミット分のダンプファイルがある。1つ前の圧縮ファイルには 91773 コミット分。欠けていたのは 69000 番台。全体の半分ほどにあたるリビジョン 91774 以降には補って代わりになるバックアップが存在しない。次またコミットデータが欠けていたらどうしたらいいのでしょう。さっき「ときどき」って書きました。1か月でも1年でもないときどきとはどういう意味か。気が付いたときに手動で圧縮ファイルの移動&リネームを行っていたという意味で、2020 年以降4年ちょっと忘れていたせいでバックアップが手薄になっています。テキストエディタの Ctrl+S に連動した編集履歴だからないならないで困りはしないけど、なんとなく惜しい気持ち。■1コミット1秒だとして 18 万コミットを再生するのにかかる時間は……180000 = 50*60*60 だから……50 時間! どうりで何日も終わらないはずだ。しかも GUI でやってたときは失敗するたび最初からやり直すしかなかったし。


2025年02月14日 (金) 給湯器から蛇口まで距離があるとお湯が出てくるまで時間がかかりますよね。今朝のこと。お湯が出るのを待つあいだ勢いよく水を流すのがもったいないなと水量を絞ったときに思ったんです。自分はお湯が出てくるまでの時間が一定であると仮定して、そのあいだ無駄に流れる水を節約しようとしたけれど、実はお湯が出てくるまでを決めているのは流れた水の量ではないのかと。勢いよく流せばそれだけ早くお湯が出てくるのではないかと、思ったのでした。瞬間湯沸かし器ってぐらいなので、沸いたお湯でさっさと管の中の水を押し流すのがいいのではないか。そういうことを何十年生きてきて初めて考えました。


2025年02月13日 (木) もう起動することもないだろうと、PS4 と PS3 と PS2 の映像音声ケーブルと電源ケーブルを抜いて本体共々片付けてしまった。PS4 と PS3 は初期化もした。ここ1年で起動したのは PS3 だけだった。PS2 はパソコンでプレイできるし PS4 は PS5 でプレイできるけど、PS3 は PS3 でしかプレイできない。エンドオブエタニティの3周目をやっていました。いざとなればリマスター版(PS4)が販売されている。6系統ある入力が PC(DVI-D) と PS5(HDMI) の2つに整理された。これは新しい PC をつなぐ準備。対応していれば電源ケーブルを省略してケーブル1本で済ませられるらしいけど、16 年前のモニタはもちろん対応していない。最近のモニタでわからないのは音声の出力のしかた。S/PDIF が HDMI でもいいんだけど、複数ある入力から選択的統一的に出力する端子があるとアピールされていない。あるといってイヤフォンジャックしかない。PS5 の方でも出力は HDMI か USB オーディオの2択であるらしく、接続性が悪くて使い勝手のいいハブのありようがイメージできない。モニタからスピーカーに向けて光デジタル1本で済んでいる今でもまだまだモニタの裏は散らかっている。電源ケーブルと電源ケーブルと電源ケーブルと DVI ケーブルと HDMI ケーブルと光デジタルと光デジタルとスピーカーケーブル。PS4 と PS3 と PS2 のケーブルを片付けてこれ。胞子が舞う腐海が広がっていたんですよ。手箒でさささと集めるだけでにぎりこぶしくらいのかたまりになった。映像音声一体の HDMI ケーブルになって1対1のケーブルは減ったとしても、N 対 2 (PC+PC+ゲーム+ゲーム+... 対 画面+スピーカー) のケーブルは減ったんですか?■プライムでやっと他所と同等だとわかっていたはずなんだけど、支払日を勘定に入れずに丸2日放置されているあいだに 3000 円くらいセールで安くなっているうえ土曜日までに届けるよと商品情報がアップデートされていた。出品者が同じ公式ショップで出荷元も同じアマゾンの倉庫なんだけど、月曜日の注文の到着予定は来週の水曜日なんだぜ。どうなってんだ。キャンセルしてもう一度注文しました。


2025年02月10日 (月) パソコン買ったった。ケースで数えたら3台目、マザーボードで数えたら4枚目にあたる。2009年以来の刷新。なんだかんだ楽しみではある。


2025年02月09日 (日) [AtCoder] 今日は AtCoder Regular Contest 192 (Div. 2) があった。昨日書いたように配点は 4-6-6-6-8。400 点問題と下振れた 600 点問題を1問か2問解くのが目標だった。A と C にそれぞれ 50 分ちょっとかける2完遅解きで青パフォ中上位は法外なリターンに思える。コンテスト成績証。ARC は解ける問題が少なくて1問に時間がかけられるのが嬉しい。■A 問題 ARC ArcARC=11_ARCRA=1111_ARCRARC=111111_、と並べていって、長さ 2n+1 の右端(+1)を除いて1にできると思ったらサンプルの1が理解できなかった。右端に0があるのに Yes なんだって。「SN+1​=S1​,SN+2​=S2​,AN+1​=A1​ とします」というループ条件を読んでいなかった。精確には読もうとしたけど理解できなくてそのまま忘れていた。だったら ARCR=1111 を単位として長さ 4n はすべて1にできる。4n+1 と 4n+2 と 4n+3 がどうか。いろいろな挿入パターンを考えてみたけど、1が1個あれば ARCR=1111 の1つを AARCR=_1111ARCCR=11_11 に置き換えて、0に変えられないダブりの A(C) を元からの1に合わせて 4n+1 を Yes にできる。4n+3 はどうか。+3 を ARC=11_ とすれば2つまでは1に変えられるので、元からの1が1つでもあれば Yes にできる。4n+2 のケースがやっかい。さっき A か C をダブらせると書いたのには意味があって、R をダブらせると基本単位が壊れて ARRCR=___11 になってしまい2文字しか1に変えられなくなる。+2 は AAARCR=__1111ARCCCR=11__11AARCCR=_11_11 型にしたい。これら3つは R をダブらせて壊れた ARRCR=___11 にさらに +1 文字したものの上位互換になってるんじゃないかな。確かめてないけど。だからこの3つの型だけ考える(ローテーションできることを考えれば実質的に2つ)。型とはどういう意味か。ダブらせる A または C は同じ基本単位に属している必要がないということを意味している。元からの1の位置を4の剰余で分類して、A または C の位置関係にある2つの1が存在していれば長さ 4n+2 のどんな数列も1に変えられる。N=4n+2 に対する答えに全く自信がなかったのでまずはそれ以外のケースを実装して提出した。提出 #62607384 (RE×24/WA×1/AC×48)。結果を見ると、N=4n+2 型のケースが 24 ケースあり RE になっている。その他のケースは1つを除いて AC。3行目の N=3 のケースの条件が誤っている。N=3 は2つまで1に変えられる。それに N=3 は N=4n+3 に含まれるので意味のない場合分けだよ。答えやすいからとわざわざ N=3 だけ括りだしてそれで間違えてりゃ世話ないよ。続いての提出 #62608228 で無事 AC。問題の所在の切り分けができたおかげでスムーズにデバッグできたと思う。ペナルティ5分は安い。■C 問題 Range Sums 2。配点が同じ BCD を開いてみて C がインタラクティブだと見えたので C 問題しか読まなかった。インタラクティブ問題は総じて考える要素が控えめだとの偏見を持っている。つまり解きやすい。実装さえできれば AC できる。実際、この提出 #62614705 の冒頭にある3行のコメントが一番最初に書かれた部分なのであって、やることを明らかにしたあとで実装に取りかかったのだった。その実装に 50 分かかったんですけどね。s と Ps の関係とか頭がこんがらかってしかたがない。ABC ではないのでわからなくなるたびに立ち止まって慎重に整理してから実装を進めていった。■B 問題 Fennec VS. Snuke 2。残りの 15 分で読むだけ読んだ。手つかずの山の数の偶奇と、お手つきの山の値の和の偶奇と、手つかずの山の値の偶奇を見て考えるのかなと思った。自分では考えられません。


2025年02月08日 (土) [AtCoder] 今日は日本レジストリサービス(JPRS)プログラミングコンテスト2025#1(ABC392)があった。F 問題を6分半で解いても4桁順位だということがつらい。まあ、E 問題に1時間ちかくかけてペナルティも3つ出してはいるんだけど、それでも。■A 問題 Shuffled Equation。permutation でやったけど sort で十分だったらしい。1以上だからそうか。■B 問題 Who is Missing?。1000 以下なのでどうやっても愚直に2乗の計算量でやってもいい。Ruby の Array には集合演算が混じってるので、計算量にこだわらずお手軽にそれで。■C 問題 Bib。ビブってなんだゼッケン的なものかとイメージしていたらゼッケンの文字が目に入ってきた。そうらしい。あるいはよだれかけ(そちらが第一義)。問題文には人 i が存在しているけども、どのゼッケンがどのゼッケンを見ているかをゼッケン順に答えるだけでいいのは素直な設定。それを読み取ってさえ添字を取り違え配列を取り違え解答を4回も5回も書き直して問題を読み直してやっとサンプルが合う。最近タイプが下手だ(タイピングのせいにしています)。母音が転がるし濁点が抜けるしコンマがドットになるしで、P と Q が入れ替わらないはずがない(しかし直そうとして2回以上入れ替えていたのはおかしいよね)。6分かかった。■D 問題 Doubles。(1≦Ki という制約を見て)1面ダイスってどんなんだろう、メンコでも2面あるぞと考えていた(どうでもいい。どうでもいいけど……球かな)。最初の誤った方針。ある数字を出しやすいサイコロの上位2つを選んで確率を求める。最大の確率を出す2つのサイコロを選ぶ。実装を始めてすぐに気がついたけど、これは違う。選んだ2つのサイコロは複数の数字が共通している可能性があり、出目がそのどれであってもいいのだから、出目を決め打った確率を比較してはいけない。サイコロペアごとの数字を比較して最大を求める。演算の節約のために無駄に定数係数をループの外に括りだそうとしてバグらせた。一度素直に式を書いてから括りだしてやっとサンプルが合った。AC まで 10 分。■E 問題 Cables and Servers。グラフ、UnionFind、辺の数は木以上。自己辺なしとは書かれていない。多重辺なしとも書かれていない。できないケースの答え方が書かれていないことに戸惑ったけど、辺の数は足りているのでできないことはなかった。しかし極端なケースでかなり自由につなぎ替える必要があり、また、無駄につなぎ替えることは許されていないので、泥沼にはまりかねない危険を感じた。UnionFind をしながら同一連結成分をつなぐ余剰辺を見つける。余剰辺をつなぐ先が問題。余剰辺を持っていない連結成分につながないといけないのはもちろんだけど、余剰辺を持っている連結成分同士もつながないといけない。しかし A から生える辺で B-C をつなぐような無駄な操作はできないし、すでにつなぎ替えて連結になっている頂点同士をさらにつなぐような無駄をすると辺が足りなくなる可能性もある。秩序だって整然と無駄なくやるのは難しい。たとえば次数に注目した処理を一度は書いたのだけど、自己辺がある今回それは意味のある違いを生まない。余剰辺の有無を連結成分ごとに考えるのが正解。3ペナのうち1ペナはデバッグプリントのせいだったけど、2ペナは純粋に見落としと操作ミスによる。最近は E 問題が解けないのが当たり前なので F 問題に浮気したい気持ちを抑えてじっくり解答を読み直して見落としを見つけた。頭から読み直すことで思考の流れをなぞることになるのだけど、2度目は知識があるのと手を動かしてもいないので細部に注意を向ける余裕がある。1時間弱+3ペナ。■F 問題 Insert。今回も腑抜けた F 問題だったが前回と違い今回は得点できたので許す。操作をするごとに Pi 番目だった数字がどんどん後ろになっていくことが問題になる。愚直に配列を操作すると TLE になる。しかし最後の操作で Pn 番目だった数字は Pn 番目で確定することにすぐに気付く。では P_{n-1} 番目についてはどうだろう。Pn 番目を無視したときの P_{n-1} 番目で確定する。順序付き集合があれば答えられるので BIT を使った。■G 問題 Fine Triplets。シンプルな問題で G 問題で 600 点で3秒制限だから無理な気配しか感じない。しかし順位表を見ると 600 人以上が解いていたので(最終的には 752 人)、見かけ倒しだったのかもしれない。調和級数的な計算量で探索できるかと思ったけど、実行してみると TLE が避けられない感じ。■日記を書いているうちに結果が出た。コンテスト成績証。1113 位で青にちかい水パフォが出てもいいんですかと疑問に思ったけど、過去の成績を見ると 900 から 1000 番台前半はだいたい水パフォなので不思議はなかった。それに順位は参加者の人数にだけ着目しても流動的な指標なので占いの役にしか立たないのだった。■明日は ARC の div.2 がある。配点が 4-6-6-6-8 なので解けても1問だし、今日の成績次第では Rated 参加もできない見込みで参加意欲が限りなくゼロだったけど、とりあえず Rated 参加はできる。600 点問題が3問あれば1つか2つは下振れてるやろの精神でやろうかな。


2025年02月01日 (土) [AtCoder] 今日は AtCoder Beginner Contest 391 があった。序列の範囲の上限付近で相応の歯ごたえがあり満足感もあった DE に対して、やるだけだった腑抜けの F がその位置で 500 点を与えられていることに、自分がその点数を獲得していないことに不満が隠せない。■A 問題 Lucky Direction。自分は連想配列で8通りの変換を書いたんだけど、4文字から4文字への文字置換で十分だったらしい。無駄に3分も使ってしまった。■B 問題 Seek Grid。答えが1つだけあると書かれているので、また、4乗が通る制約なので、素直にやる。4分かかったけどこれはしかたがない。むしろがんばっている。■C 問題 Pigeonhole Query。鳩ノ巣原理? 最初巣から巣へ全部の鳩を移すのかと思っていたが実装を始めて勘違いに気がついた。鳩を1羽特定して巣から巣へ移す。巣にいる鳩の数を管理するのに加えて、鳩がどこにいるかも管理する。巣にいる鳩の数が1と2の間を行き来するたびに答えが変化するので、この数も追跡してすぐに答えられるようにしておく。■D 問題 Gravity。最初に書いておくと 44 分かかった。状況を厳密に定義するためなのだとしても、最近の自分の頭は +0.5 秒を適切に扱える明晰さを失っている。0.5 秒ってなんなんだよお前はいつ消えて俺はいつの状況を答えればいいんだよとキレそうだった。前回と前々回の ABC では実際にキレ散らかしていて問題を解くどころではなかったので、そこは良くなっている。まず列ごとに各ブロックがどの高さにあって下から何番目かを調べる。次に下から X 番目のブロックの最大高さを調べる。そうすると X 行消すのに何秒かかるかがわかる。わかる? わかるということはわかるけどそれと実際にクエリに答えることは別の問題なのだった(消えるのは y 秒後か y+1 秒後か、それと 0.5 秒が問題)。サンプルがいつまでも合わない。あと X 行消すことができない場合に注意する。■E 問題 Hierarchical Majority Vote。セグメント木的な形をイメージする。セグメント木は二分木だけど3つ組の木そのものが問題になったものとして JOIG 2024/2025 本選 過去問-C 修学旅行 (School Trip)を最近解いた (#61675220)。まあいいや。解答の形としては根までマージを繰り返してから、選択的に葉まで下降して葉の数を数える。どういう情報を持ってどういうマージをするかはセグメント木の使い方そのもの。それをまとめるのに1時間 10 分かかったし、マージ部分のミスを修正するのにも6分かかった。こうなるとなんにも惜しくないのでやっかいな問題を解いた満足感の方が大きい。F 問題と違ってね。■F 問題 K-th Largest Triplet。小さくない N に対して3乗の組み合わせが問われているので、これが現代の Pairs かと絶望に襲われかけた。だけど K の上限は min(N^3,50万) なのであって、大きい方から順番に K 個の値を数えることができる。とりあえず A,B,C をソート。プライオリティキューで [N-1,N-1,N-1] から得られる値を起点にして K 個の値を取得しては最大3個の値を追加する。最大というのがポイントで、[i,j,k] をキューに追加しようとするタイミングは [i+1,j,k] と [i,j+1,k] と [i,j,k+1] の値を取得した3回あるので、たとえば i*N*N+j*N+k をキーにして重複を管理する。それだけで通ったのが納得いかない。21 分。F 問題の中で最弱なのではない、F 問題にふさわしくないんだよ。■ここ3回の ABC は極めて不本意な結果。簡単に解ける問題と解けない問題はいい。解けるけど時間がかかる問題にてきめんにやられているのが直近の3回。D 問題が簡単に解けないのが問題といわれればその通りだが、少し前まではこうではなかった。これが ABC の新しいスタンダードなのであれば、うーん、タイムアタックはつまらない。これまでも完走できてはいなかったけど、これまで以上に途中のある時点での順位が最終順位になるような状況が、得点がコンテスト時間のとり方(100 分)に大きく左右される状況がつまらない。ARC に活路を見出すこともできない中途半端な脳みそなので困っています。■E 問題。さっき書いた解法の後半、根から葉まで下降するパートは必要なかった。マージ部分が間違っていたから葉まで下降する必要がある気がしていたのであって、バグを取ったらその必要もなくなっていた。提出 #62311932 (AC / 221 Byte)。シンプルになった。最初からシンプルにすっきり解けないぼんやり頭が問題か?


2025年01月31日 (金) どこか経由で読んだ。「私の観測範囲の C の初学者、構造体で詰まる人が結構いる。でもってポインタは案外詰まらない。」■構造体で詰まるという詰まり方に興味がある。ポインタでは詰まらないという点に関連付けて想像してみる。C の前に他の Python みたいな言語になじみがあると、数値など不変型とオブジェクトなどの参照型はすでに知っているものと思う。ポインタは参照になぞらえて理解できる。構造体はオブジェクトになぞらえて理解できそう? C にしかなくて戸惑うのは、不変ではなく参照でもないもの、malloc せずに存在している構造体ではないだろうか。これは自分の実感に基づいた想像で、Ruby に散々なじんだあとで C++ を触ると、変数のごつさにびびってしまう。スライシングみたいな罠にもなるやつ。詰まり方に興味があるというのは要するに、構造体を malloc して使うのは普通にできるんじゃないかと疑っている。


2025年01月26日 (日) [AtCoder] 今日は ARC191 があった。配点が 4-5-6-7-8 であるように、下位の方(Div.2)。ABC で ABC の3完を繰り返しているにもかかわらず幸いなことにまだ Rated 参加権を失っていなかったので、時間通りに参加した。■A 問題 Replace Digits。S の先頭から T の大きい数字から上書きしていけばいいんだけど、T の最後の文字がちょっと困る。最後の文字でなければ、例えば T が最後でない位置に 1 を含んでいたとしても、T 自身の他の数字で上書きした体(てい)で 1 の数字をなかったことにできるけど、最後の文字だけはその手が使えない。他の人の提出(#62128560)を見ると、すごく簡単そうに最後で s[-1]=tt if !s.include?(tt) と帳尻を合わせている。自分はすごーく苦労して間違いながら回りくどい処理をした。提出 #62132900 (AC)。最後の文字を最初に取り分けてメインの上書き処理を通さなかったのがうまくなかった。あとから最後の文字だけ上書き処理をして、それによって余ったすでに上書きに使われていた T の文字が無駄にならないように玉突きで再利用を繰り返した。玉突きの適切なインデックスを求める 19 から 21 行目と 28 行目の find メソッドの条件がまあ間違いやすくて WA を2つ出した。N=M=5 程度の小さなランダムケースを作成して、スクリプトの解答と自分の解答(私はバイオコンピュータを内蔵しています)を突き合わせて NG ケースを探して見つけた。でもこの苦労は避けられたはずの無用な苦労だったと。■B 問題 XOR = MOD。A とほぼ同じ人数が通しているみたいだけど自分はこちらの方が解きやすかった(A 問題通されすぎ)。N を増やしながら愚直解を列挙してみれば、N=X が必ず最小の解として存在している。また、解の上限は 2N-1 らしい。N が2の冪乗のときにもっとも解が多く、区間内のすべてが解になる。そこを手がかりに前後の N の2進表現を考えてみると、0の数が答えの数(2.pow(0の数))を決めている。つまり、N の0だった桁が0か1に変化したものが X (決めつけ)。提出 #62134372 (AC)。K-1 のビットパターンを N の0のビットに埋め込む。■C 問題 A^n - 1。N+1 が素数だと解きやすい気がするんだけど、それだけ。こういう問題にアプローチする術(すべ)を持っていない。■D 問題 Moving Pieces on Graph。一応読んだだけ。基本的には最短経路+1本の辺があればコスト2を払って一方が待避することですれ違いができる。最短経路が部分的にでも2本に分岐していれば追加コストはいらない。もちろん全く共有辺を持たない最短経路が2本あるのでもいい。最短経路でなくても、+1 コストの経路には価値があるし、待避できる余分な辺がないならどんなコストであっても2番目の経路に価値がある(全体が輪っかのグラフを想像する)。どうやってコードにするかはわからない。コーディングだけが問題かもわからない。■D 問題。すごいケースがある。S と T が直線で通じていてそれ以外の迂回路がないとき、S または T から外部へ双方が待避して位置を入れ替えることができる。それはもう最短経路とか全く関係がない。■A、B がどちらも緑 diff だったらしい。ARC は怖いところだよ。緑落ち寸前の自分が解いているという事実に納得しかないけども。■■■D 問題に訪れた AtCoder 最高の瞬間。提出 #62153446 (WA×1/AC×63)。circle_like というケース名をヒントにランダムケースに傾向を与えてダメケースを探した。提出 #62154569 (AC)。補助なし時間制限ありでこんな問題解けるわけないよ(自分には)。正解を出力する他の人の AC プログラムを助けにしてデバッグに次ぐデバッグで数え切れないバグを潰してやっとこれ。■正解を知るのにこちらの提出 #62136607 をコンパイル(&リンク)したものを使わせてもらっていたのだけど、ソースを読むと、変数 L と R を使ってささっと2つ目の最短経路を見つけている。どういうことか。それぞれ f(G,S) と f(G,T) に対応していることから S と T から BFS した結果かと思うのだけど(f 関数を読まない)、最短経路上にある各頂点について、一方(とりあえず S)からの距離をメモして、その距離に重複があれば迂回路があると判定できる? 迂回路があるということは、S(または T) から等距離に異なる2つ以上の(最短経路を構成する)頂点が存在すること? そうっぽいけどこれ当たり前にわかること?■自分がやったこと。S から BFS をしたあと T から後戻りすることで最短経路を1つ特定する。最短経路上の S を除く各頂点について、隣接頂点のうち最短経路にないものの S からの距離を調べる。自身の距離を d として、d-2 以下であることはありえない。d-1 である場合は、異なる最短経路が合流してきたことがわかる。d である場合は +1 コストの経路が合流してきている。d+1 の場合は、ここから分岐したのかもしれないし、+2 コストの経路が合流してきているのかもしれないけど、どちらの場合でも扱いは同じ。引き返してはいけないというルールがないので、分岐してすぐ戻ってくることで +2 コストの経路になる。S と T には特別な扱いが必要。S には合流してくる経路がなく分岐していく経路しかないので調べない(今は分岐路の合流点を調べている)。T に隣接する頂点で d+1 の距離を持つ頂点に注意が必要。さっき引き返してはいけないルールがないと書いたけど、T に限っては引き返す経路がすれ違いのための迂回路にならない。しかし +2 コストの本当の迂回路が合流してきている場合も考えられる。最初にやった S からの BFS を T で止めることでこの2つを区別できるようにした。これには +3 コスト以上の迂回路の合流を妨げない意味もある。あとは「すごいケース」への対応を追加でやる。WA×1 はこのケースへの対応がバグっていたせい。最初の1回の BFS 結果を流用するのをやめて、2回目3回目の BFS をすることで間違いがなくなった。たいへんすぎるよ。まずやるべきことがわからないし、やるべきことをやる方法がわからないし、正しくやるのも難しい。■■■『はじめての数論 原著第3版』を開いている。第21章は「法 p でのべき乗と原始根」というタイトル。C 問題は位数と原始根が前提知識として必要だったとわかる。そしてもちろんそれを知っているというだけで解けるなら問題にならない。


2025年01月25日 (土) [AtCoder] F 問題までけりがついたので今日あった ABC390 について。今回も前回と同じく F まで解けない問題ではないけど、すっごく時間がかかる。A 問題から5分かかったし。■A 問題 12435。1回転倒を直してみて 1,2,3,4,5 になるかどうか。最初からソート済みの場合が No であることに注意。■B 問題 Geometric Sequence。解答を書いてからサンプルを試してサンプルの3でひっくりかえった。公比 0.8 の等比数列ですって。3項で分数で等式を作って通分すればいいのかもしれないけど、そこは Ruby なので Rational におまかせ。■C 問題 Paint to make a rectangle。黒のマスを囲む上下左右の大枠を求めたら、その内部がすべて黒か?であるか。■D 問題 Stone XOR。N が 12 以下だけど、12 の階乗が 4.7 億 (470 メガ) を超えるので愚直 DFS は通らない。少なくとも Ruby では望みがない。愚直 DFS を書いて1分以上かかるのを確認してからどうやって処理量が減らせるか考えた。1の袋を2の袋に足してから2の袋を3の袋に足した場合と、1の袋を3の袋に足してから2の袋を3の袋に足した場合は区別する必要がない。どうやって同じことの繰り返しが防げるか。すでに混ぜ物がされている袋は他の袋に混ぜる必要がないのではないかと考えた。■E 問題 Vitamin Balance。ビタミンごとに3回処理をして、カロリーから摂取量への換算表を作る。摂取量で二分探索をして答えを求める。答えの二分探索の中で換算表を二分探索で逆引きすると TLE (と WA と RE) が出たので、ありうる摂取量のリストを作ってからどの摂取量が答えになるかを調べた。これだと支配的な要素はソートの O(NlogN) になる。■F 問題 Double Sum 3。間違った問題を解いていた時間がほとんどといっていいほど長かった。問題文中の大文字の L,R は数列の区間を表す数字だけど、小文字の l,r は数列の値の範囲を表す数字。自分は x 座標が上下で y 座標が左右を表していてもそんなのは便宜的な区別だからどうでもよくて、第1軸第2軸以上の意味を勝手に持たせて直感や慣例に反すると文句を垂れるつもりはないつもりでいたけど、大文字小文字が異なるだけで同じアルファベットに異なる意味を持たせるのは罠だと文句を言いたい。そういう誤読も含めて試行錯誤したことの結論だけ書く。小さい値から順に処理をして、自身が連続した値グループ(f 関数の内部で l,r で表される範囲)の中で最小の値である場合に限って、主客転倒で L,R の選び方を数えて操作回数を計上する。自身が値グループの中で最小の値であるとは、左右にある同値と -1 した値のどちらでも最も近くにあるものを含まず、自身を含む区間が選ばれた場合に、そのようなグループが発生する。l,i,r の3つの値を使って (i-l)*(r-i) の簡単な式で数えられる。■自分のすべての提出。宿題が多すぎるんよ。D から精進でした。いつまで水色かわからんで。