/ 最近 .rdf 追記 設定 本棚

脳log[2023-01-20~]



2023年01月20日 (金) [AtCoder] 精進。ABC244-F「Shortest Good Path」(青 diff)。当日はなんか色々アドホックに短いパスを作る方法を考えるも提出に至らなかったんだけど、今日は愚直に頑張って探索をした。半分全列挙の反省から(「半分全列挙の問題が半分全列挙だと教えられる前に解けたためしがない。強いて言えば制約の数字に特徴が現れるが、手掛かりがなさすぎる」)、指数時間が通る制約だなと意識できたのが解答の方針を決めるヒントになった。提出 #38176946 (AC / 412 Byte / 3920 ms)。問題を作る方が難しそう。制約、制限時間、停止すること、最悪時間。解く方は祈って出すだけ。


2023年01月19日 (木) [AtCoder] 精進。昨日「次に埋まりそうなのがあと6問(279/285)である ABC-C」と書いたので6問を埋めた。5問は灰 diff だったけど ABC025-C「双子と○×ゲーム」が青 diff だったのでそれついて。■提出 #38160016 (AC / 941 Byte / 73 ms)。過去に埋め損なっているとはいえ今ではこの型の問題は何度か経験がある。とりあえず1手指したふりで相手方の得点を占ってから手を選ぶ。メモ化再帰で、盤面は3進数で。■数だけでいえば次に埋まるのはあと 10 問(97/107)の ARC-B なんだけど、黄水橙水橙黄緑水青水はきついでしょ。■本当は今日は「「競技プログラマーハンドブック」(Antti Laaksonen氏著)を翻訳・公開しました 基本的テーマから発展的テーマが300ページ超に渡って記載されており目次を見るだけでも興味深いハンドブックです。 「こんなのあるんだ!」という皆様のわくわくの助けになれば幸いです。 PDF: https://t.co/in2H7x6QdW https://t.co/QaaXOvs7yc」の本を読み進めていて、何度か名前だけは見かけたことがある(でも一度も調べなかったんだね) Z-Algorithm が出てきたので、前々回の ABC284-F「ABCBAC」(水 diff)を解こうとしていたのだけど、頭が爆発して書ききれなかったのだった。


2023年01月18日 (水) [AtCoder] 精進。107 問ある ARC-A のうち最後に残った1問 ARC128-A「Gold and Silver」(茶 diff)。コンテスト当日も(#26588127 WA×6)今日も(#38133790 WA×6)、現在持っている金と銀の量を保持して、金を銀に(銀を金に)交換した方が得をする場合に金(銀)の量と取引履歴を更新していった。なんか今日の方が遅いしメモリ消費も多いし同じケースで WA になってるし、バカなの?■今日の2個目の提出 #38134402 (TLE×5)。小数の代わりに有理数を使ったら WA が1減って残りの WA が TLE に化けた。TLE の背後に WA が隠れている可能性はあるけど、たぶん考え方は間違ってないんだと思う。交換レートである A の値の上限が1ギガであるときに愚直に金銀の量を変化させていってはいけないのだ。■提出 #38140604 (AC)。現在持っている金の量と現在持っている銀を金に交換した場合の大小関係が問題なのだから、現在持っている金の量を1に固定して銀の量を金の量に対する比率で保持しても問題がない。そこから整理すると過去のある時点の A の値と現在の A の値の大小を比較するだけになって、小数や有理数で比率を保持する必要もなくなった。あとは取引履歴を記録するのに配列を複製する非効率を避けるなどした。■これが茶 diff とは信じがたい。たぶん見えていないものがあって遠回りな考え方をしてるんだと思う。たとえば過去のある時点の A と現在の A の比較ではなく隣接する2つの A の比較だけでいいらしいけどその理由とか。ともあれ現時点で ARC-A が全部埋まった。他に埋まっているものはない。次に埋まりそうなのがあと6問(279/285)である ABC-C。


2023年01月15日 (日) [AtCoder] 今日は ABC285 があった。自分のすべての提出。A-E の5完。かけた時間が A=2分 / B=15分 / C=6分 / D=8分 / E=(21+27)分。■やるだけの B 問題「Longest Uncommon Prefix」の問題文が難しすぎた。パラメータが i,k,l と3つもあるのが良くない。1つを固定して2つ目を動かしているうちに3番目のパラメータに目移りしてその隙に固定していたはずの1つ目が動き出す。その繰り返し。■C 問題「abc285_brutmhyhiizp」は桁数を固定して 26 進数を足していった。■D 問題「Change Usernames」は「お前が名前を変更するのを待ってるぜ」行列を作って変更できる人からどんどん変更していった。グラフ用語で Functional Graph というらしいというのをちょっと前のなもりグラフの問題の時に読んだ気がする。このとき>20220827。解答に際してはグラフとか閉路とかは考えずに単にシミュレートしただけ。待ち行列を配列にしたのは失敗で、1人の改名を複数人が待てるべきではなかった。入力制約のきれいさに助けられた。■最後は E 問題「Work or Rest」。曜日がループしているのでとりあえず1日目を休日にする(最低1つある休日を1曜日と定めたともいえる)。問題文をわかりやすいように解釈すると、休日どうしが近傍の平日の生産性を早い者勝ちで取り合う構図になる。i 日目を休日にしたときの生産性の合計の最大値を記録する DP で、i-1 日目が最後の休日だったら、i-2 日目が最後の休日だったら、と考えていく。係数が2分の1なので N^2 = 2500万でも通るはずだと思ったけど TLE だった>提出 #38064073。ループの回数が2分の1でもその中で配列参照1回に関数呼び出しが3回、関数呼び出し1回につき配列参照2回で、ループ1回当たり 10 の処理をしていたのでは足が出る。Ruby にとってはそういう厳しい制約。これが通っていれば E にかけた時間は 21 分だったけど、TLE 解消に 27 分かかったよね。提出 #38078419 (AC / 1026 ms)。改善ポイントは2つで、1つ目は P (生産性)関数を予め計算してメモしたこと。2つ目は DP で記録する値に i に固有の値を加算していたせいでその値を利用するときには減算していたこと。加算をやめれば減算もいらない道理。なお、この改善はコンテスト終了後のものであり、コンテスト中は C++ で AC を取った。サンプル2の答えが 33 ビット整数だったから 64 ビット変数を使ったらローカルでは実行時エラーになった。コードテストでは通ったので提出したら AC だったけど、慣れないものは使いたくないものだ。■Ruby で自分の改善バージョンより倍ちょっと速くなるらしい>「ABC_285_E "Work or Rest"をrubyで解く」。■F 問題「Substring of Sorted String」はセグメント木で範囲内が昇順かどうか判断できる気がしたけど RE に加えて WA もあるのではお手上げ>提出 #38082557 (WA×8 / RE×1)。一部に AC もあるけどこの提出 #38074190 の AC と一致しているのでは価値がない。この提出は隣接する2文字の転倒関係だけに注目した勘違いの産物だから。■転倒位置の管理が意図に対して誤った手段、というわけではなく、いつもの手抜きセグメント木を修正してモノイドを載せる試みが(RE×1を除いて)失敗というわけでもないとしたら、そもそもの考えが足りていないために AC が9個足りない結果になっている可能性がある。なんだろ。■「S の部分文字列とは、S の先頭から 0 文字以上、末尾から 0 文字以上削除して得られる文字列のことをいいます。 例えば、ab は abc の部分文字列ですが、ac は abc の部分文字列ではありません。」 折りたたまれた用語の説明を読んでいなかった。今回の「部分文字列」は連続部分文字列と呼ばれることもあるものだった。やつあたりに聞こえるだろうけど、知らない人のための用語解説なら折りたたむのも結構だけど、問題の一部としての定義なら隠してはいけないと思う。必ずクリックして開かなければいけないなら(それなしでは問題文が曖昧になるのなら)隠す目的はなんだ。■F 問題。提出 #38104204 (AC / 1984 Byte / 634 ms)。ソースを見るに余裕のなさが窺える。「脳みそに余裕がなくなるとクラスや日本語変数がソースに現れる傾向があるみたい」。日本語をクラス名にするために Class オブジェクトを明示的に new しているとはずいぶんな余裕のなさ(※日本語は小文字扱いなので(=定数ではないので) class 構文が使えなかった)。間に合うみたいだったのでセグメント木はやめて転倒位置をソート済み配列で管理する当初の方式に BIT 26 本の利用を付け加えた。これを時間内に解くのは無理だよ、量的にも。青 diff でした。青 diff ならもう射程に入ってないといけないんだよなあ。■経緯を忘れてあらためて考えると、転倒位置の管理に BIT を使わない理由がないなあ>提出 #38325205 (AC / 1645 Byte / 593 ms)。BIT 27 本。


2023年01月14日 (土) [AtCoder] 精進。今日あった ARC153-C「± Increasing Sequence」(青 diff)。コンテスト中は場合分けをして簡単なケースから答えを作っていた。たとえば、N=1 なら答えは 0 しかない。A 数列が 1 のみまたは -1 のみだった場合は、1個だけ符号を反転させて項数 N-1 の等差級数と打ち消し合わせればいい。幸い N の2乗より大きい値を使うことが許されている。他には 1 の列と -1 の列が混じり合わず隣り合っているケースの答えなどを作った。そんな具合に特殊ケースを捌いていって、最後に残ったのがサンプル1のケース。つまり、2個以上の 1 と -1 が混じり合ったごく一般的なケース。ここで手が止まって時間を迎えてしまった。■提出 #38021545 (AC / 673 Byte / 194 ms)。最後に残ったケースを考えた結果、そのケースの解法がその他の場合をすべてカバーしてしまっていた。なんじゃそら。考える前に書き始めるからこういうことになる。いみじくも1番目に示されていたサンプルを1番に考えるべきだったのだ。解法はこう。いったん A 数列に 0,1,2,...,N-1 の重みを割り当てて合計を計算する。合計が0ならそのままそれが答え。合計が正なら、重みの後半を後ろにずらしたり、前半を前にずらしたりしてバランスを取る。そのためには A 数列の後半部の累積和が負だったり前半部の累積和が正だったりしなければいけない。合計が負の場合も同様に。■(80 分も残していたのだから)時間内に解けたはずだよ。くやちい。■書ける対象が少ないんだから A と B についても書く。A 問題「AABCDDEFE」(灰 diff)。とりあえずメモに書き出してみた。11、22、33、...、99。そして3桁目からは数字を使うと紛らわしいので 11abccded という感じ。じゃあ 0 を除くという例外規定はあるけども1桁目もアルファベットを使って aabcddefe と表せるな。スクリプトの1行目にコメントとして書き込んでそれを見ながら考えよう。提出 #38005488 (AC / 174 Byte / 64 ms)。提出して WJ のときに問題名が目に入った。最後にタイトルに回帰する見事な伏線回収では。それかお前の目が節穴か。末尾が EFE であることに何か罠があるかと疑ったけど何もなく。灰 diff でした。Ruby で2番目に早く提出されたこちら #38003727 があざやか。自分はこうしたら1桁目が求まるな、次にこうしたら2桁目が求まるなという手探りの手続きを書いて提出したけど、この提出は完全に見切ってから書かれている、しかも時間をかけずに。正直なところ 99999 を足すとどうなるのか自分はわかっていない。■B 問題「Grid Rotations」(水 diff)。慎重に問題文を読んでからサンプルの図解と照らし合わせて誤読がないように努めた。ありがたい図解を眺めていれば、1度の操作で abcde 行がどのように並べ変わるかわかるし、2度の操作でも並び順が入り乱れることがないことが確認できる。行と列の並べ替えが独立していることも容易に推測できる。提出 #38009253 (AC / 378 Byte / 711 ms)。緊張してるのかしらないけど、括弧の対応を間違えたり + を * とタイプミスしたり、まあまあサンプルを合わせるのに苦労した。添字配列を作って Array#values_at を呼び出すのは効率が悪いみたいで、他の人の提出よりいくらか余分に時間がかかっている。Array#rotate を完全に失念していた。


2023年01月11日 (水) ちょっと古い新聞を読んでいたら、交通教本にこういうことが書いてあるらしい。「見えないことは存在しないことではない」■これはまったくその通りで、周囲を見回して人がいないことを確認する、車が来ていないことを確認するというときに、いる・いないの二値ではなく、いる・いない・陰になっていて確認できていないの三値で景色を塗り分けないといけない。いるの否定(=いることが確認できなかった)がいないではないことを認めなければいけない。しかし、すべての免許保持者が NULL を正しく取り扱えるとあなたは信じられますか。私には無理です。


2023年01月10日 (火) デスストランディングの耐えられないところ。デスストが悪いというのではなく、プレイヤーの性質に関わること。何か。BT への対処と優良な配送への努力(時雨、転倒による荷物の劣化対策)を同時に求めるのをヤメロ。荷物は1つも落としたくないし劣化させたくないしバイクからも降りたくない。でも BT がいるところ雨が降っていてケースが劣化する。劣化はリペアスプレーで対処できるけどバイクを降りたらその後の配送がだるいから駆け抜けたいけどほぼ成功しない。捕まれば荷物が落ちて劣化する。最近は素直に捕まって流されて大型の BT を退治すれば晴れ間が訪れてすっきりだと了解していたのだけど、廃墟で回収物を集めているうちにまた雨が降り出して BT が現れたじゃない。同時に対処させるのをヤメロ。俺は一度に2つのことはできない。荷物を回収して届けたいんだから BT は引っ込んでろ。一度の対処でもうたくさんだ。という愚痴を PS4 の電源を切って書いているのが今。することがあるときに横槍を入れられるストレスに耐えられませんでした。


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命令のコストとかそのレベルからは「すんごく速そう」以外の感想はない。