/ 最近 .rdf 追記 設定 本棚

脳log[2026-02-12~]



2026年02月12日 (木) [AtCoder] バグ出しの最中である AWC beta。問題を解くにあたって一番問われているのが冗長な文章を素早く読み飛ばす日本語力かなと思った。その問題文。気にするほどではない些細な違和感がないではなかったけど、その中で3回目の「握手の列」の怪文章度合いが際立っていた。■「N 人の参加者が一列に、全員同じ方向(右向き)を向いて並んでおり」これだけでは情景が想像できない。同じ向きを向いて横隊を作っているのか縦隊を作っているのかがわからない。だからその後の「全員が同じ方向を向いて一列に並んでいるため、隣り合う2人の参加者が握手をするとき、左側の参加者(番号が小さい方)の右手と、右側の参加者(番号が大きい方)の左手が触れ合います。」という論理がナンセンスに基づいている。そして、ここで説明される行為を握手とは呼ばない。握手とは(直前までどちらを向いていようとも)向かい合ってするものだ。慣れていれば競プロ的な設定(隣り合った人が右手と左手をつなぐ。先頭の人の左手と末尾の人の右手は余る)の肉付けに失敗したのねと了解できるけども、まじめな初心者ほど困惑するのでは? 世の中には文字とみれば先頭から末尾まで1文字ずつなめるようにしか読めない人間がいるのです。そういう人を指してまじめと表しました。


2026年02月10日 (火) 二日前から突如としてお尻の穴の右内側面に固いでっぱりが存在していて、きゅっと締めるだけで異物感が主張するというのもあるし、単純にお尻を拭きにくいという不便もある。やや痛い。毎日物理的刺激にさらされる部位であり難しいような気もするけど、明日には消えてないかなあ。■あ、突然ではなかった。さらに二日前から固くなってる部分があるなと思っていたら、二日後にでっぱってきたのだった。押しても引っ込みませんよ。はあ、嫌だ (こんなこと日記に書きたくない)。


2026年02月09日 (月) 今朝は雪が残っていてとりあえず家の前だけ歩くつもりで自転車を押していったら、そのまま全行程1時間40分歩き続けることになった。自転車だとメーター計測30分(+メーター停止時間約10分)かかる距離で、だらだら歩くと2時間半弱かかるところだから、1.5 倍速で歩いた計算。さて……(片道が10km弱なのでそれぞれ順番に20km/h弱、4km/h、6km/h弱の想定です)。早々にジャケットを1枚脱いで腕まくりをして前腕をラジエーター代わりにしたが着いたときにはシャツが汗でくたくたになっていた。膝を持ち上げる筋肉なのかな、両鼠径部が筋肉痛ぽくて一日中動きがギクシャクしていた。


2026年02月08日 (日) [AtCoder] 今日は AtCoder Regular Contest 214。■A 問題 Same Sum Grid Path。分かれてすぐに合流する最少の4マスを考えると、あるマスの右と下が同じ数字でないといけないとわかる。4マス1単位をオーバーラップさせながら視野を広げると、スタートから等距離にあるマスが同じ値を持っていないといけないとわかる。そこまでやるならどのパスも同じ値を持つとわかる。実装ミスでペナルティを1回出しながら 18 分で AC。まあ 300 点問題なので (かなり遅い)。■B 問題 Missing Number in Graph。1からのパスを考えると、各頂点の番号と頂点1の番号との2つの値の XOR が N-1 個わかる。この N-1 個の値から頂点1の値がわかるだろうか。しばらくわからなくて N-1 個の XOR された値を眺めていた。それらの数字の中には N を超える値もある。たとえば N=4 だとして 3^4 = 7 なので頂点1の値が3か4ならそういうこともある。そういうのをヒントにして候補を絞りながら現実的な時間で頂点1の値を探索できるだろうか。N を超えてはみでたビットが M 種類あるなら 1<<M 通りの探索をして許されるだろうか。ダメっぽい。うーん。ここでちょっと飛躍をして、N-1 個の値全部の XOR を計算してみた。サンプルの3ケース目だから N=4 で、3つの値の XOR で、これは頂点1の値を含む4個の値の XOR と同じということになる。3個の値には頂点2と3と4の値と、奇数個の頂点1の値が含まれているから、そうなる。これと1から N までの N 個の値の XOR (0からの N+1 個の値の XOR でもいいけど同じこと)と XOR を取ると、食べられた数があぶり出されてくる。次は N が奇数の場合。サンプルの2ケース目がそうだけど N=1 でありあまり一般的なケースではない。同じ手法で N-1 個の値の XOR を計算したとき、偶数個の頂点1の値が相殺されて頂点1の値が消えてしまうから、あぶり出されてくるのは2つの値の XOR となり、そのどちらの値も頂点1の値として有効なので確定できない。-1 で良さそう? 他に確定する助けになる情報や方法はない? 投げたら AC だったので結果オーライ。■D 問題 Distinct Sum Grid Path。A 問題と同じ見た目。N<=13 だけど「全て 6000000 以下である」が難しい。電気毛布をオンにしたお布団があったかくて寝落ちしているあいだに終わっていました。今日は積もる勢いで一日中雪が降っていて帰り道が怖かった。信号で止まろうとしている車が黒い地面をひっかきながら 30 cm ほど滑って前の車にゆっくり迫っていくのが見えた。ノーマルタイヤのこの自転車ならどうなる。白い歩道がサクサク音を立てている。■自分のすべての提出コンテスト成績証。AB どちらも灰 diff で(ABC の diff と ARC の diff はそのまま比較できない印象)、茶パフォもありうるかと思ったけど、意外に昨日と同じような結果だった。つまり良くはない(「ぼちぼち」)。実際の diff は知らないけど、簡単な問題しか解けないのが自分です。


2026年02月07日 (土) [AtCoder] 今日は AtCoder Beginner Contest 444 があった。結果はまあぼちぼち。がんばって解いた E 問題が 2000 人くらいにもう解かれていたり。■A 問題 Repdigit。uniq.size でやろうとして String#squeeze メソッドの存在を思い出した。あんまり使い道がわからないメソッド。もう完成しているのに chomp を省いてマジックナンバーを1から2に書き換えたりしていた。■B 問題 Digit Sum。Ruby には digits.sum メソッドがあります。■C 問題 AtCoder Riko。問題文が難しい。あっとこーだーりこ? じゃがりことは似ても似つかなくてまったくわからない。謎の Riko に意識を持って行かれて問題が頭に入ってこない。さすがの 350 点だなとしばし考え込んでいた。全ペアを考えるには N が大きすぎる。ソートしてみようか。最大のものがまず L の候補。それより小さいものが L を作ろうとすると、半分に折り返して大きい方からと小さい方からでペアを作るしか方法がない。そうしてみると、最大のものが L ではない場合は、L の候補は最大と最小の和しかないということもわかってくる。答えの候補は2つしかない。ここで N=1 のケースがありうるか制約を確かめた。ある。最大と最小の和を求めるときに同じ1つの要素を参照するとおかしなことになりそうなので、場合分けをした。あと、答えの順序が昇順に指定されていた。提出直前に、ふと、どうでもいいよねと確認したら昇順と書いてあった。事前に要素数を出力させるのがありがちな罠。最大で2要素なのにソートした。■D 問題 Many Repunit Sum。変化量をメモしておいて、変化量の累積和を計算しながら各桁の値を求め、繰り上がり処理をしていく。しばし手が止まったのは、何桁まで処理すれば十分なのかを考えてのこと。N と A がすべて最大の 200000 のとき、繰り上がりの累積が全体で何桁桁数を増やすのか、考えてみてもわからなくて、事前に用意する配列の大きさが全く見積もれなかった。それで、普段は嫌ってやらないことだけど、配列の自動拡張に甘えてとりあえずやってみる方針で実装をした。出力できるサイズに収まることは確かなので TLE にはならないと思ったけど、提出後もまったく安心はできなかった。■E 問題 Sparse Range。問題を読む。空ではない全区間から選んで数える。一瞬勘違いしかけたけど、要素が1つしかない部分列が「どの 2 つの要素も差が D 以上である」という条件を満たすか否か。満たすんですね。あぶなかった。Array#all? メソッドと Array#any? メソッドでは初期値が異なっていて空配列に対して呼び出したときの結果が違うんですよという(論理的に正しい)ことを私は知っています。問題が理解できたところで、全連続部分列の累積和を列挙する的な処理がしたい。要素を左から見ていって、それまでの始点の累積に対して現在の要素が終点になる場合を考え、また、現在の要素を始点として累積に追加する。単一要素の部分列も対象だから、順番としては現在の要素を始点として追加してから現在の要素が終点となる場合を数える。何を記録しますか? 各要素ごとに有効な区間の右端が決まっている。右端をキーとしてそこまでの範囲を有効な区間とする始点の数を記録した。ところで、有効な区間の右端は区間に含まれるすべての要素によって制約される最小の値になります。現在の要素に照らして、期限を越えた区間を取り除き、長すぎる区間を切り詰めるように累積情報をメンテナンスすると、現在の要素を終点としうる区間の数が数えられる。これを BIT で数えたい。数えたいんだけど、現在の要素が有効な区間をどれだけ右まで伸ばせるかということがすぐにはわからなくて、BIT に区間を計上したり区間を切り詰めたりするための情報が足りなかった。結局それも BIT で予め求めることになった。BIT を使った2段構えでとてもたいへん。たぶんだけど問題を無駄に複雑にしていると思うんだよね。もっとすっきり解けたんじゃないかという気がする。使える頭がないので実装をがんばりました。■30 分残しても F 問題はさっぱり。順位表を見ると F と G を両方解いている人がとても少なく、F を飛ばして G を解いている人がそれなりにいる。今日の F は鬼門ですか? (難しいケースと面倒くさいケースが考えられます。その後わかったことは、G 問題と AI の親和性が高いケースも考えられます)■自分のすべての提出コンテスト成績証。4桁順位で水パフォ +21 レート。ぼちぼちなんだよなあ。■■■E 問題。尺取りというワードをよく見る。各始点ごとにどれだけ範囲を右に伸ばしていけるかということを、範囲内の値を SortedSet で管理しながら調べるらしい。値の範囲が大きすぎるので BIT でこれをやるには座圧が必要。偶然だけど自分の解法では可能な範囲を値ベースではなく添字ベースで管理していたので座圧なしで BIT に情報をのせることができていた。書いていたように別の解法はたしかにあったけど、そちらにはそちらの面倒が(SortedSet がない Ruby には)あったらしく、すっきりした解法はなかったのだった。


2026年02月04日 (水) [AtCoder] 先週末にあったらしいデンソークリエイトプログラミングコンテスト2026(ABC443)。都合の悪いことは見ないことでなかったことにできます。■A 問題 Append s。はい。■B 問題 Setsubun。とても難しい。N と K の上限がとても大きい(10 の 8 乗)のを見て全探索を諦めたけど、実は食べた豆の積算は2乗のオーダーで増えていくので何も問題がなかった。本番ではしかたなく 1 年目に N 個食べて、1+t 年目に N+t 個食べるなら、累計は (初項+末項)×項数÷2 だから……と考えていって、でも必要なのは 1+t 年後ではなく t 年後の累計だから t=t-1 を代入して……と補正して、サンプルの答えが1合わないから問題を読み直したら、0 年目に N 個食べるって書いてある! (初項+末項)の立式からやり直そうとして、実は出てきた答えを単にマイナス1するだけで補正できるなと気が付いて、修正に次ぐ修正でやっとの提出だった。7分かかった。■C 問題 Chokutter Addiction。シミュレートするだけ。3分半。■D 問題 Pawn Line。上に移動させるということは、入力された値(R_i)をマイナス1するということです。実装を終えてからサンプルが合わないことでこれに気がついて、どうやって書き直しをせずに修正するかを考えた。入力された R_i を N+1-R_i に変換するとその他の修正が不要だった。B 問題からこんなんばっか。提出したら TLE。処理内容は、高い山から順番に、左右にある低い山を1低い高さまで引き上げるという処理を繰り返す。山の高さの上限が N なのでプライオリティキューはいらない。全部の高さを処理対象にできる。各駒(山じゃなかった)が処理対象になるのは、初期の高さと、引き上げられた結果の高さの計2回であり、その処理では左右2つの高さを見るだけなので、O(N) であって TLE になる理由がわからなかった。TLE×2AC、差分は2バイト×2か所。実は最初に書いたときから、同じ駒が左右の駒から2回参照されてキューに2回登録されることがあるのは知っていた。左右の高さを参照するときに、現在の駒より低い位置にあるかを条件にしていて、現在の駒より2つ以上低い位置にあるかを条件にはしていなかったから。1低い位置にある隣の駒を1低い位置に移動する無駄な操作をキューに入れても害はないと思ってそのままにしていた。どういう入力でこのサボりが2乗のオーダーの計算に繋がるか。最初から操作の必要がない階段状の入力で1、2、3番目の駒が1、2、3回キューに入れられることで全体の処理量が (1+2+3+……+N) = N(N+1)/2 になる。■E 問題 Climbing Silver。BFS でも DFS でもいいからグリッドに結果を書き込んでいくことでグリッドの大きさ(最大で 900 万)に比例した計算量で答えが出せる。しかしとにかく壁破壊がやっかいだった。各列一番下の壁の位置を予め調べておいて、壁破壊ができる状況なら即座に最上段まで壁を破壊して結果を書き込んでしまえば良かった。6分オーバーで提出した #72910971 (WA×26) の間違いは、壁破壊が可能なのはスタート地点(N,C)から連続する左右の範囲に限られると勘違いしたこと。そうではない。壁を縫って到達した遠くの列の下半分が道ばかりだったら、そこでも壁破壊ができる。50 分近くあって時間内に実装しきれなかったうえに勘違いで WA とは何にも惜しくなくて逆に悔しくない。■■■精進。E 問題。提出 #72939980 (AC / 2313 ms)。完全に書き直したこれは行ごとの DP。マス目に4つの状態を持たせた。すなわち、「ゴール未達_道」「ゴール未達_壁」「ゴール到達」「ゴール到達_破壊」。初期状態で壁は ゴール未達_壁 となり、道は ゴール未達_道 となり、スタートマス (N,C) が ゴール到達_破壊 となる。あとは各行各マスで下の行の3マスを参照して、一番下にある壁の位置も{記録/参照}して、if 式が3重の複雑な状態遷移を書いた。Ruby で3桁 ms の爆速で通している人がいて (提出 #72911773)、ビット演算がその秘訣らしい。自分の複雑な遷移がビット演算にできるわけがないから、たぶん2種類の DP を平行してやるという噂の解法が、ビット演算に分解&合成するのに向いていたのかなと思う。あるいは全然別の解法なのかもしれないけど、一緒でも別でもどちらも知らない解法です。


2026年02月03日 (火) のちみちみんななすんらのなてらもらしらとなくらなくらな■呪いのショートカットキー発動。今日が初めてというわけではないけど、検索に頼るしかなかったのは初めてだった。最初の2件は Alt+Kana だと言っていた。自分には当てはまらなかった。その次は Ctrl+Shift+Kana だと言っていた。当たり。難しすぎるでしょ。俺は1時間後には忘れるよ(そしてまた繰り返す)。


2026年02月02日 (月) まんが王」■今や紙の本を取り扱っていることが貴重なので、マンガとラノベ以外の本が買えなくても、エロマンガが買えなくなっても使っていたけど、昨年末のリニューアル後から、強制ログアウトのタイミングでカートを空にされているらしいことが複数回観測されている。あのね、カートの中身はお気に入りよりもさらに購入に近い段階にある、お気に入りとは別のストックなのだ。ひと月未満の周期でショッピングカートを強制没収されるお店でじっくり満足な買い物ができますか? 1~2か月かけてカートの中身が1万円を超えるのを待ってから注文するのが自分の購入スタイルだった。もう買えないね。■自分は入金途中で勝手に硬貨と紙幣の投入口を閉じる銀行の ATM にも腹を立てる人間なので、非人間の不躾なふるまいに一切の我慢も受容もできないのです。


2026年01月27日 (火) 「DI(依存性注入)という言葉がキモい」への回答。その違和感は“誤訳”から来ている」■もっともな感覚だと思う。同じように思った過去の自分は Parameterized Dependency という語をでっちあげた。目的ではなく形式寄りの命名だとは思うけど、その代わり当てはまるなら直截でわかりやすいと思う。ましてや “誤訳” よりはね。訳してないけど。今日わかったのは、訳す前の Dependency Injection をそのまま読み取るなら違和感は生じないのかもしれないということ。ネイティブではないのでわかりません。勝手用語を発明しなくても「DI (依存性注入)」で十分なのかもしれない。■C++ のテンプレート機能もね、型がパラメータになることで操作対象にできるというのがマクロ(※)のお株を奪って画期的だったという認識。次にパラメータ化したいのは関数の引数リストなんだけど、タプルでできるんですか? それと uniform function call syntax があると三者の相乗効果が期待できる。■※マクロ。Rust とか Crystal のマクロはなんか新しいよね、全然知らないけど。cpp コマンド(わざわざ呼び出したりしない)とは全然違う。


2026年01月26日 (月) ページネーションとパジネイション(pagination)は同じか否か。


2026年01月24日 (土) [AtCoder] 今日の JPRSプログラミングコンテスト2026#1(ABC442)。■A 問題 Count .。問題名のドットを見落としませんでした。いつでもどうすれば条件分岐(|| とか)が省けるかを考える。今日は c==?i||c==?j (c は各文字) を一度書いてから 'ij'.index(c) もありだなと思ってからの 'ij'[c] で提出した。■B 問題 Music Player。珍しく長い変数名 playingvolume を使ったものだから、タイプしながら volume は長すぎるせめて vol にすべきだったと後悔していた。他の人の変数名が気になります。■C 問題 Peer Review。エルデシュ数とかベーコン数をイメージしながら UnionFind の雰囲気を感じていたけど、直接の利害関係しか関係がなかった。Hash を使って重複を除いたけど、制約で予め除かれていたので無駄だった。Hash を使うだけで目に見えて実行時間が増えるので、本当に必要なとき以外は使うべきでない。必要なときでもある数までは配列の線形スキャンの方がましなのである。■D 問題 Swap and Range Sum。隣接項の交換なら累積和を2点更新するだけだと思って書き始めたら、実は1点更新だということがわかった。添字で間違えないように{参照/更新}する可能性のある項をすべて列挙してから実際の処理を書いた。順番に並べて前後の位置関係をヒントにすればたぶん取り違えないだろう。■E 問題 Laser Takahashi。「すなわち、モンスターは大きさを持ちません」 偏角ソートして累積和の差分を答えるだけなんだけど、角度を逆引きする関数をリファレンスから探してきても誤差で殺されそう。私はもう Rational を使う楽ちんさを知っています。傾きを分数で持つ。分母がゼロの場合を irb で確かめると例外が飛んだ。じゃあその場合だけ小数の無限大で (Float と Rational の比較は Ruby におまかせできる)。求める累積和の区間が円環の切れ目を含むと面倒なので例によって2周分の累積和を用意した。傾きが等しい点を累積和でうまく扱えるように座圧(傾きを傾きの序列で代替)もした。サンプルが合わない。デバッグ出力を見てよく考えると Rational で表現した傾きでは原点で対称な点を区別できない。どうする、今からベクトルの扱いが思い出せるか? どの象限にあるかという数字と傾きのペアでソートすることでなんとかなった。でも WA×5。象限によっては X=0 のときの値を負の無限大にしないといけなかった。これの修正に6分。全体では 25 分(+ペナルティ5分)かかった。■F 問題 Diagonal Separation 2。5000 の2乗は嫌な感じ。でも他には 600 点の G 問題しかないのでやるしかない。行単位で DP をするのかと思ったけどサンプル2が合わない。k の値を前の行から引き上げるとき、列方向の制約によって追加コストが必要になるのだった。そして日記を書いている今どうしてもサンプルが合わなかった理由がわかったのだけど、コストは追加されるだけではなく削減されることもある。1時間残していても問題を理解するのに足りなかったんだな。■■■F 問題水 diff 下位マジ? なら解けたなあ、とは思えない。


2026年01月19日 (月) [BAD BOY] 左ブレーキレバーとシフターの位置についての覚え書き。同じ試行錯誤を今日を含めて2回はやった気がするので、3回目をやる前に読んで済ませられるように。現在はブレーキレバーのクランプとクランプの外側にある足のあいだにシフターをクランプしている。I-SPEC EV タイプのブレーキレバーにはいらない足がある (「Supported here」)。末広がりのブレーキレバーの形(気に入らない)は奥から手前というより内から外への指の動きを要求するけども(でないと指が届かないし、届くように近づけるとレバーとハンドルが接触する)、手を内に寄せるとシフトレバーが邪魔で親指を手のひらと向かい合わせにできない。シフターのクランプをブレーキのクランプより中心に寄せるとどうだろうか。やってみた(たぶん1、2週間前にも試している)。問題点1。シフトレバーの動きがブレーキのクランプを擦る。これは多分にシフトレバーの問題であって、グリップのロックリングでさえうまくやらないと擦ってレバー操作に差し支える。ブレーキのクランプは厚みがあるのかどうしてもうまくやれない。金属加工ができるなら指の腹を受け止めるために広がっているレバーの部分を削っている。問題点2。シフトレバーが遠くなってシフトアップ操作が難しい。なんとかなるのではと予想していたけど、シフトダウンはともかくシフトアップが難しい(人差し指でやるのも親指でやるのもどちらも難しい)。以上より親指の行き場に迷う現状が一番ましだということがわかった。面倒なのでもういじらない。いじりたくなったら今日の日記を思い出して読むこと。


2026年01月17日 (土) [AtCoder] 今日は ABC441 (Promotion of Engineer Guild Fes) があった。典型度が高い王道な問題セットだったと思う。ただし典型=簡単ではない。■A 問題 Black Square。マス (P,Q) が一番左下の座標だったりするといやらしいけど、べつにそんなことはなく、P...P+100Q...Q+100 の範囲と比較する (3点ドットは半開区間)。■B 問題 Two Languages。難しかった。まず読み取るべきは「wi​ は高橋語か青木語のどちらかの単語」という制約。そうすると単語が高橋語のアルファベットで構成されているか、青木語のアルファベットで構成されているか、あるいは共通部分で構成されているかを判定すれば良い。共通部分 ? 'Unknown' : 高橋語 ? 'Takahashi' : 'Aoki' という論理。ところが実際に問題を解いたときはそんなにすっきりとした区分けができていたわけではないから、入力を加工して共通部分を用意するということをしなかった。その場合は 高橋語ではない ? 'Aoki' : 青木語ではない ? 'Takahashi' : 'Unknown' という否定混じりの論理にならざるを得ない。それは難しい。■C 問題 Sake or Water。B 問題より素直。カップ数を最小化しつつある程度以上のお酒を飲みたいのだから、ソートして量の多い方から、最悪の場合を想定して飲んでいく。■D 問題 Paid Walk。出次数が4以下で、L が 10 以下。スタート地点は 1 で固定。4 の 10 乗が 100 万程度だったから、全部試せばいい。過去2回拍子抜けした経験からもうわかってきたけど、D 問題で DFS をやるときは、DFS 自体が課題という判定なのか高速化の工夫が求められない傾向にある。今日のこれは DFS に限らず BFS でも良かったのかもしれないけど、DFS で書きたくなる問題ではあったと思う。■E 問題 A > B substring。問題文に嘘が書いてありました。「S の空でない連続する部分文字列は N(N-1)/2​ 個ありますが」と書いてあって、これは S から 2 つの文字を選ぶ組み合わせだから、1文字だけの部分文字列がカウントされていない。半開区間で文字列を表すなら末尾の次の位置までをありうる区間として、空でない部分文字列の数は N+1 から 2 つを選ぶ組み合わせだから、(N+1)N/2 になるけども N(N-1)/2 にはならねーな。空でない連続する部分文字列の数をあらためて考えると、始点ごとの終点の数が 1 から N までだからその和で N(N+1)/2 になる。指を使って N=5 の場合を2回数えたから間違いない。ということをたどたどしく念入りに確かめてからリロードをしたら、目の前でしれっとマイナスがプラスに変わりました。やめてほしい。これでやっと問題に取りかかれる。A を +1、B を -1 としたときの累積和が正になるものの数を数えたい。Hash 表を使って愚直にカウントすることが許されない制約なので BIT を使うことを考えた。できそう? できた。BIT で負の添字を扱うために N 程度の下駄をはかせてゼロの位置をずらした。その添字の操作を何度も繰り返すと間違えるので BIT 操作を関数でラップする丁寧さを見せた。■F 問題 Must Buy。DP です。N+数回 DP をすることが許されるならなんとかなる。ところが1回だけの DP をするのにも 5000 万のオーダーの処理になってしまう。時間制限を見るとちょい長めの 2.5 秒。Ruby だと苦労して工夫しても不可能な可能性があります。G 問題を読みましょう。■G 問題 Takoyaki and Flip。誤読をしていた。タイプ3のクエリではたこ焼きの合計を答えるのだと思っていたが最大値だった。図解で max とばっちり書かれていたけど、最初の実装を終えるまで見なかった。まだ誤読していた。タイプ2のクエリによって各お皿は1回だけ裏返されるのかと思っていたがそうではなかった。問題を正しく理解してからも、遅延セグメント木に何を乗せるか、不足に気が付いては足すということを繰り返した。区間演算について。たこ焼きを足すだけではなく裏返しもある。そして裏返しの裏返しは何もしないことではない。たこ焼きがゼロになっている。最終的に「表になっている面に足す」「裏返して0にする」「(裏の裏で)そのままの面で0にする」という3つの状態を考え合わせることになった。セグメントに保存する値について。裏向き無効と表向きの最大値のいずれかだけではなかった。ある範囲に表向きの皿と裏向きの皿の両方がある場合は、裏返しても裏返しても有効な最大値がある。最終的に表向きの無効値最大値と裏向きの無効値最大値を記録した。nullable integer のペアを記録したということ。提出 #72566496 (TLE×38/AC×27)。でも TLE です。しかも TLE の中に WA が隠れているのがほぼ確実。でも全然しっぽを出さなくてやっかい。■G 問題。レアなバグの原因がわかった気がする。Op::Abs2 と Op::Abs1 をセグメントに適用するときに、一度でも裏になったことのある面の最大値を、最大値がある場合はゼロにリセットするのを忘れている。どうせ TLE だから高速化のアイデアが出るまで再提出はしない。■E 問題。解説に O(N) 解答があるらしい。それは考えてみたい。■B 問題。昨日は大まじめに書いていたんだけど、解答の論理は否定も共通部分セットも使わずに 高橋語&&青木語 ? 'Unknown' : 高橋語 ? 'Takahashi' : 'Aoki' でも良かったのだな。横着して1文字あたりの判定を線形時間で書いて、判定結果を変数に保存もせず、だけど同じ判定を2回繰り返すまでは横着しきれなかったと見える。■■■動画を見ていたらブラウザからのコピペで Takahashi という風にスペースがくっついていたけど AC だったという話が聞こえてきた。これは自分もコンテスト中に気が付いていて、以前にそうならないようにした設定が失われているなと思ったのを思い出したので、改めて設定をし直した。Firefox で about:config を開いて space を検索するとまず editor.word_select.delete_space_after_doubleclick_selection = false という設定が見つかって、でもこれを true にしても期待した効果を発揮しなかったので下にスクロールしていくと layout.word_select.eat_space_to_next_word = true という設定が見つかって、これを false に変更すると期待通り余計なスペースが選択されなくなった。めでたし。