/ 最近 .rdf 追記 設定 本棚

脳log[2025-07-14~]



2025年07月14日 (月) [AtCoder] 精進。先週(20250712)あった ABC404-F「Jump Traveling」(黄 diff)。コンテスト終了後に「距離 K の隣接頂点があるなら頂点1から BFS をするだけ。距離 K の頂点集合を得る方法はあるか?」と書いていた。まず、BFS をするだけではないらしい。遷移先が多くなりすぎるのだろうか。kotatsugame さんの動画を見たんです(【競技プログラミング】ABC414【実況】)。いみじくも「頂点1を根としたときの深さだけでなんとかできる?」とも書いていたのだけど、そのための秘密兵器が頂点を BFS 順に並べる、ということらしいです。そうするとある頂点の子や、ある頂点の K 階層下の子孫を区間で表すことができる。かつて PAST1-K「巨大企業」を解くにあたって頂点を DFS 順に並べること、それをオイラーツアーと呼ぶことなどを学んだけれど(20200607p01)、今日初めて BFS 順に並べることの利点を1つ知りました。解法のポイントも聞こえてきました。K=a+b であるとして、a 階層上に上がってから b 階層下る移動を考えるとき、a 上がるときに通って来たパスを引き返すように b 下る移動は不正なので除外しなければいけない。でも、b 階層下の子孫も、同じ階層にある除外すべき子孫も、どちらも区間(包含関係にあります)なので扱いが容易。訪問済みフラグを BIT で管理したら BIT 上の二分探索で区間内の未訪問の頂点を効率良く見つけることができる。■提出 #67602188 (WA×34/AC×19 / 2933 ms)。なんでやねん、サンプル通ったやんけ。サンプルが通るまでにも色々ありました。K 階層下の子孫だけでいいかと思ったら1から K まで必要だし、BFS 順に並べるって言ってんのに DFS をしていたりもしました。それなのにサンプルの1は答えが合うんですよ。役に立たねーな。■提出 #67603447 (AC / 2904 ms)。お風呂デバッグをしてきました。頭や体を洗っているあいだは持ち込んだ雑誌を読むこともできないので、ぼんやり考えるのに最適な時間。変更点は 87 行目の1文字だけ。up<kup<=k にした。頂点1に向かって K 階層遡っても、それって1手前にいた頂点だから無駄じゃね? と思って、移動先を K 階層下、1階層上のち K-1 階層下、2階層上のち K-2 階層下、……、K-1 階層上のち1階層下に限定していたのだけど、まっすぐ K 階層上も移動先に加えるべきだったということ。なぜか。折れ曲がるように移動して到達した頂点からまっすぐ K 階層上というのは、初めて訪れる場合がある。K 階層まっすぐ下るだけが移動じゃないのだから「1手前にいた頂点だから無駄じゃね?」は勘違い。■Crystal で通している人の提出 #67550795 を見ましたが、えー、全然違うー。Ruby で同じことをして通りますか? だったらだいぶ短く簡潔に解けるということだけど。■■■寝て起きたらフレンズさんのツイート()や他のブログで読んだことが頭に入ってきた気がする。たぶんだけど BFS をするのかな。頂点ごとに訪問済みフラグを持つわけだけど、追加で K 状態を区別する。これは K 歩の何歩目で訪れたのかを表す。さらに追加で直前の頂点も持つ。直前の頂点へは次の移動ができないのでこれも状態として区別する必要がある。そうすると状態数が NNK になってよろしくないのだけど、直前の頂点が2種類あるとその後の遷移はすべて網羅できているので、3番目以降の直前の頂点フラグはすでに立っているものとして良い。ということが書いてあって、同じことを(もしくは不正確なこと不十分なことを)繰り返しているだけだと思うんだけど、昨日説明を読んだときは何を言っているのかちんぷんかんぷんだったんだよね。何度文字列をなぞっても頭に入って来なかった。脳みその可塑性応答性が低い!■提出 #67610103 (WA×34/AC×19 / 665 ms)。2NK 状態の BFS を書いてみたけど WA だった。サンプルは通るんだけど何が足りないんだろう。■提出 #67610224 (TLE×2)。バグの原因はちょうど K ステップの移動の次の一歩は直前の頂点がどこかに関係なく移動できるということを考え忘れていたこと。これを直して十分に遷移ができるようになったら WA がなくなって TLE が2つ出た。3.3 秒 以下の 3098 ms と 3225 ms だからあとちょっとなんだよなあ。■提出 #67610541 (AC / 2809 ms)。変なことしないで3要素の配列をキューに入れたら良かった。自分で書いたから Crystal の人のスクリプトも読めるようになったけど、N+N の状態数で K ステップを1単位とする BFS をやっているだけに見える。本当に? それだと K ステップの中間ステップが重複する無駄が生じない? (K 歩ごとに直前の頂点フラグがリセットされているようだから)


2025年07月12日 (土) [AtCoder] 今日はミラティブ プログラミングコンテスト2025(ABC414)があった。C 問題に殺された。■A 問題 Streamer Takahashi。日をまたぐことはないので単純に比較するだけ。■B 問題 String Too Long。Ruby なのでオーバーフローを気にしなかったけど、ひとつの数字の上限が 60 ビット(+符号ビット)ってやりすぎじゃない? 100 個足したら 64 ビット超えるよ。■C 問題 Palindromic in Both Bases。全部列挙して積集合を求めるのだと思った。列挙するのが難しかった。いざ列挙できたら実行に時間がかかりすぎだったし最後のサンプルが合わなかった。C 問題に取り組んでいた 55 分がまるまる無駄になった。■D 問題 Transmission Mission。電波強度とは基地局がカバーする幅のことらしい。基地局はどの位置にも置けるので、1つの基地局がカバーする範囲(家から家の距離。重ならない)の総和が答え。基地局が N 個置けるなら答えは0。基地局の数が足りない分だけ1つの基地局が複数の家をカバーすることになる。家ごとに左隣の家との距離を持って、距離が小さい順に左隣の家と基地局を共有する体で距離を強度として答えに計上する。プライオリティキューすらいらない。55 分かけて解けなかった 350 点問題に対してこの 400 点問題は提出まで5分なんですよ。難易度評価どうなってんだ。■E 問題 Count A%B=C。まず愚直解を書いた。b を固定したとき、a が 1 から n の n 通りをとり c は自動的に決まるのだが、b 未満の a から a==c となる組を除外する(ん? 全部だこれ)。また、c==0 となる b の倍数も a から除外する。これらは排反。そうすると 2..n なる b に関して n-(n/b)-(b-1) を足し合わせたものが答え。定数や1次式のシグマの計算はいいが、n/b の合計を愚直に線形時間で求めることはできない。ABC172-D「Sum of Divisors」の高速化と同じことをする (20200628p01←あんまり覚えてないけど雰囲気で)。提出まで 25 分。■F 問題 Jump Traveling。K が 20 以下という制約がくさい。距離 K の隣接頂点があるなら頂点1から BFS をするだけ。距離 K の頂点集合を得る方法はあるか? 終了後に愚直にやって TLE を出した (#67561329)。まずはここから。■直径が小さい木なら N 回の DFS が O(N^2) になる。どうしようか。頂点1を根としたときの深さだけでなんとかできる? ある深さに兄弟がいないときに選択肢を奪われるのがやっかいだし、そうでなくてもよくわからないな。偶奇が合わないと無理っぽい? これが 625 点問題じゃないのはおかしいでしょ。■■■C 問題。WA のち AC。昨日も今日もバグの元は9行目にあった。昨日サンプルが合わなかったバグは、"11,22,33,44,..." の種となる [0,1] と、"1d1,2d2,3d3,4d4,..." の種となる [d,10] (d=1..9) は用意したけど、"101,202,303,404,..." の種となる [0,10] が用意できていなかったこと。そして今日のバグも9行目にあって、N が9未満のケースで N より大きい回文数をうっかり計上してしまっていた。一日空けて落ち着いて清書してなお間違えるこれが C 問題で 350 点だというなら、相性が悪いとしか言いようがない。棒に当たったと思ってもう忘れました。来週また同じ問題が出ても解けません。■D 問題を二分探索で解く。提出 #67586675 (AC)。貪欲法では間違えないけど二分探索だと間違いやすいのは3つ以上の家と家が等距離にある場合だと思う。ある距離を境にして家と家を同じ基地局でカバーするかしないかを分けるとするじゃない。家が等間隔に配置されていると、必要な基地局の数が M より多いと思った次の瞬間には M より少なくなるという状況が起こりうる。同じ距離だけ離れているけど、基地局がいくつか余っているのでそのうちのいくつかだけ個別に基地局を割り当てますよ、という状況が起こりうる。貪欲法だと基地局の数をベースに答えを求めるので間違えないけど、二分探索だと距離をベースに基地局を数えるので、同じ距離だけ離れてるけど基地局を分けたり共通化したりと扱いを変えてちょうど M 個の基地局を使い切らなければいけない、というところに難しさが生じる。自分の提出では4行目で距離を N 倍して N 未満の添字を加えることですべての距離を区別可能にしてから二分探索をしている。そして総和を求めるときには N で割ったものを足す。たいへんですよ。未満と以下を間違えて一度 WA も出したし (#67586560)。判定関数はこちらのツイートと同じはず。「岩井星人さん「@4C3pfotQDj26958 ありがとうございます! 座標の左から見ていって、「幅X以内であれば一つの電波塔で賄う」を決めていって、電波塔の個数がM以上ならXを大きくするってやってました」」 自分のは左から見ていく代わりにソートして二分探索をしてるけどそれは単なる効率の違いなので……と思ったけど、logX と logN の違いだけで効率もほぼ同じ?■二分探索がダメな例としてこういうリプがついている。「hibitさん「@yiwiy9 6 3/1 4 5 8 11 12 正しくは 5 になりますが、恐らく最小値の二分探索だと 7 になります 正:{1},{4,5,8},{11,12} 誤:{1,4},{5,8},{11,12}」」 「幅X以内であれば一つの電波塔で賄う」の解釈が自分と違うんだよな。前から見ていくと、(1,4)←距離3以下だから同じ基地局、(4,5)←距離1だから同じ基地局、(5,8)←距離3だから同じ、(8,11)←距離3だから同じ、(11,12)←距離1だから同じ、結局「幅3以内であれば一つの電波塔で賄う」ことにすると {1,4,5,8,11,12} になって必要な基地局が1つだけなので条件が緩い。次は0と3の中間である1か2を条件にして二分探索を続けよう、ってならない? その後幅1と幅2のどちらを条件にしても今度は必要な基地局が {1},{4,5},{8},{11,12} の4つになって使える基地局の数(3)を上回ってしまうので、解は2と3のあいだ!(困る) というのは別の話でありもう書いたこと。


2025年07月08日 (火) 事業所で水槽の水がサイフォンの原理を使って排水溝に勝手に吸い出されていくのを見て、所員達が「なんで水槽を超えて水が流れていくのか解らない、、気持ち悪い」ってざわついた - posfie」■サイフォンという名前と現象はよく聞かされても結局どういうことなのか誰も説明してくれない。落ちる水の重さが新しい水を吸い込んでるイメージだけどどうなんだろ。「サイフォン」(ja.wikipedia.org) から「途中、どれくらい高い地点を通ることができるかは大気圧および液体の蒸気圧と密度による。最高地点において管内の圧力が液体の蒸気圧に近づくと液体はキャビテーションを起こしはじめ、気泡の膨張が重力による圧力差を吸収してしまい、いずれサイフォンは停止する。」 へー。持ち上げるためには大気圧に負ける圧力が必要で(?)圧力が低くなりすぎると水中から気体が出てきて(沸騰?)吸い込めなくなる? 気泡が圧力の伝達を阻害するのは油圧ブレーキのエア抜きが大事な理由だし長い下り坂でエンジンブレーキを利用すべき理由でもある。大気圧の大きさは気泡が生じるまでの限界を高めそう? 大気圧を固定したとき、液体が水銀のときの限界が約 76 cm で、水のときの限界が 10 メートルくらいに決まっているらしい。大気圧と液体の蒸気圧と液体の体積当たりの重さ(密度の言い換え。物理をやらなかったので重さと質量の区別は曖昧。面積当たりの力である圧力に呼応するもの?)の3つのバランス。水銀の限界は 760 mmHg (大気圧) と符合しているけれど、じゃあ水銀の蒸気圧が限界に及ぼす影響はどこに読み取ればいいのだろう。蒸気圧って? 「2010年、オーストラリア・クイーンズランド大学の物理学者、スティーブン・ヒューズが辞書など社会で一般に説明されているサイフォンの原理は誤りであると指摘した」とも書かれていた。今からたった 15 年前のこと。みなさんそれも踏まえたうえで「わかる」「あたりまえ」という反応をしているのだろうか。自分は名前と結果しかわかりません。


2025年07月07日 (月) [Win11] タスクスケジューラで「前回の実行時刻」「次の実行時刻」カラムをクリックしてソートすると、▲と表示されているときに降順で、▼のときに昇順でソートされている。きもちわる。ちなみに時刻の昇順(小さい順)、降順(大きい順)というのは時刻を UNIX epoch からの経過時間として理解すると間違えない。要するに、▲のときに新しい順、▼のときに古い順で表示されていると言っている。きもちわる。


2025年07月05日 (土) [AtCoder] 今日はデンソークリエイトプログラミングコンテスト2025(ABC413)があった。制約に泣かされた F 問題。■A 問題 Content Too Large。A 問題で DP はありません。A の合計と M を比較する。■B 問題 cat 2。全部作って許される制約。改行をちょん切るのを面倒くさがっても許されるかなと(一度書いたものを消して)試してみたけど、サンプルが合わなかった。AB+CD と ABC+D を同一視できなくなるからそれはそう。面倒くさがった結果手を加えることに矛盾はありません。■C 問題 Large Queue。タイプ2のクエリが長さを超えることはないという制約を読んで条件式を1つ省いたんだけど、実は省いてはいけなくて RE を一度出した。ぎりぎりを狙うのに軽率すぎるんよ。■D 問題 Make Geometric Sequence。0を含まないのが温情なのか? それでも公比 1 と公比 -1 と公比が負のケースが罠になる。それぞれ場合分けをすれば対処はそれほど難しくない。最後に残るありふれたケースの判定は、3項(a,b,c)を並べて前後2項で r に関する等式を作って(b/a==c/b)、通分したら b*b==a*c で判定できるらしかった。なるほどゼロがあると土台が成り立たない。Ruby には組み込みで Rational (有理数) クラスがあるのは知ってるんだけど、計算量が読めないのと、Rational がないと解けないとなると Ruby でないと解けないということになり、それは甘受できないのだった。オーバーフローに対する警戒心のなさなど普段は Ruby に甘えまくりだけども、謎の線引き。■E 問題 Reverse 2^i。2分割してそのままか前後を入れ替えるか。■F 問題 No Passage。やるべきことがよくわからなかった。できるできないは別として G 問題の方が求められていることがわかりやすかった。F 問題。あるマスの移動先(最大4つ)のうち2つまでゴールまでの手数が確定しているなら、大きい方+1 の手数でゴールできる。0手ゴールからじわじわ確定範囲を広げていく。終了2分前に間に合わせた提出 #67355089 は TLE×6 だった。判定と書き込みに時間差を付けてきっちり分けないとサンプル3が合わないのだけど、その結果キューに同一座標が複数回入るようになってしまった。9行目で事後的に弾いているけど、Ruby でその無駄は許されなかった。キューに入れましたよということだけを記録するメモを用意すると TLE×5 に減ったけどまだダメ。2次元座標を1つのキーにして配列参照を減らしたら TLE×3 だけどまだダメ。予めキューを H*W 本用意するのをやめて今と次の2本だけにしたり、キーの増減を代入してしまって演算子を減らしたりしてやっと AC (#67360123)。時間内の提出はたしかに多少の無駄はあったけど、許されないほどではなかったと思う。そこから AC までの改善は、はっきりいってしょうもない。■G 問題 Big Banned Grid。問題の概要はすぐわかる。それをどう実装するか。思いつけば実装は軽かった。提出 #67363448 (AC)。グリッドの左辺下辺に接した障害物からスタートして、障害物を伝って上辺右辺まで辿り着けるかどうか。F を捨てて G に粘着していれば時間内に解けたかもしれんけどね、気持ちが負けてるからあわよくば G をという発想にならないのであって、実際には可能性はなかった。■G 問題は ARC076-C「Connected?」っぽさがある。どちらも何が障害なのかを見切るのが大事で、実装は難しくないという点が共通。障害の正体も共通。これは解いたあとの感想であって、コンテスト中に一読したときの印象はフレンズさんのツイートの通りに ABC361-G「Go Territory」だった。あれは UnionFind なんだけど碁石(障害物)の配置から隣接頂点を引くあたりの実装が重かったので、今日の問題におすすめできる解法ではない。今日のは障害物で BFS/DFS をするだけで良かった。■■■F 問題。自分のやり方は実はあまりうまくなかった。どうやっていたか。ゴールまでの手数が確定したマスがあるとする。これを自マスとする。その隣接4マスに未確定のマスがあるとき、未確定のマスの隣接4マスに自マス以外の確定マスがあるなら、未確定マスを確定予定であるとしてキューに入れる。これは自マスを中心とした周囲8マスに加えて上下左右に2マス離れた4マス(合わせて 12 マス)の確定状況を調べることになる。定数倍が重いですね。どうやら想定解法(フレンズさん情報)は訪問済みフラグを数値で持って2回目の訪問で初めてキューに入れる BFS であるらしかった。なーんだ。TLE×2。←想定解法でもダメです。提出 #67382500 (AC / 1440 ms)。自分の不器用な解法が 1941 ms だったのに比べると想定解法は 25 % 速い 1440 ms になるポテンシャルがあるみたいだけど、配列を1次元化するような定数倍の改善なしでは TLE が避けられないのに変わりはなかった。どうあっても制約に泣かされたんだな。制限時間が通常と違う 2.5 秒であることの意味は、C++ と Python で解法の優劣により AC と TLE が分かれるように制約と時間でぎりぎりの調整をしていますよ、ということであって、これは即ち Ruby では針の穴を通すような唯一絶対の最適化をして初めて AC になるかもしれないし不可能かもしれない、ということを示唆している。要するに、2.5 秒を見たときから予想はしていた。だからこそ最初の提出からループを展開したコピペコードを書いていたのだけど、足りなかったのだなあ。■■■D 問題。半年前にあった ABC390-B に Geometric Sequence というドストレートに等比数列の判定を行わせる問題があったらしく(覚えていない)、自分の提出を見てみたらこれ #62034196。to_r して b/a を比較している。「Rational がないと解けないとなると Ruby でないと解けないということになり、それは甘受できないのだった」とはなんだったのか。きっちり楽してるやんけ。あ、でも次の日に今日と同じ式変形を試して提出してる (#62124460)。覚えてないけど。


2025年07月02日 (水) [AtCoder] 土曜日に日本最強プログラマー学生選手権~Advance~ -予選- (ABC412)があった。学生でなくても普通の ABC として参加していいのよ……ということが伝わりにくくて、過去には企業主催のコンテストの参加者数が伸び悩んでいたらしく、(ABC XXX) と付記されるようになったのはその対策の一環と理解しています。なかったことにしようと思ったけど火曜日に E が解けたので存在を認めてやらないではない。■A 問題 Task Failed Successfully。無加工で使用できる比較対象が同時に与えられる親切さはさすがの A 問題。だけど昔はループが必要なかったらしいです。■B 問題 Precondition。いつものごとく upcase とか uppercase とかガチャガチャやってみて当たりが引けなかったのでリファレンスを調べたら、どうやら大文字小文字を調べるメソッドはないみたいだった。びっくり。制約から特定の1ビットを調べるだけでわかるのは知ってるんだけど、どのビットかは覚えていないし、鼻につく感じもするので、大文字化して元の文字と比較するという馬鹿みたいなやり方でやった。■C 問題 Giant Domino。ドミノ1とドミノ N を抜き出してから他はソートする。貪欲法で必要な限り可能な限り最大のドミノにサイズアップしていく。今ここに4つの条件を書きました。否定で書くとこう。(1) 必要がないなら(ドミノ N が倒せるなら)やめる。(2) 次の(最小の)ドミノが倒せないならやめる。(3) 倒せるドミノのうち最大のものを選ぶ。(4) 倒せるドミノが小さいドミノだけならやめる。(4) 番目は余計だったか。自分の提出 #67133622 に (4) はなかった。倒せる最大のドミノがより小さいドミノだった場合、次のループで行き詰まって結果は同じだもんね。■D 問題 Make 2-Regular Graph。順列が通る制約。やるだけではあるんだけど、短時間でやりきれなかった。やることは勘違いしていなかった。1個以上の輪っかでできたグラフを作る。輪っかの大きさは3頂点以上である必要がある(多重辺が許されていないので)。このときに輪っかの数が最大でも2個までだということに気がつけなかったのが敗因か。そうでもない。各順列に対してどこで輪っかを作るかというのを DFS で全探索する最初の方針で実装して AC だったのだから。N の階乗(頂点列の並べ替え)に2の N 乗(各頂点で伸ばす/輪になるの2択)を掛けてもまだ間に合う制約だというのも確認していた。D 問題に時間をかけすぎだと判断して途中で E 問題に行く原因になったのは何か。消す辺足す辺の数勘定ができなかった。すごく面倒くさかった。やりたくなかった。それならしかたないね。■E 問題 LCM Sequence。解けるまで2晩かかった。D 問題の AC が終了5分前だったので、当日は終了 30 秒前に未完成のものを提出するしかなかった (#67164359 TLE×19)。コメントにあるように素数判定に時間を使い過ぎている。翌日になって調和級数的な計算量で合成数をはじけば素数判定はいらないなと思って提出したものは WA×5 だった (#67182611)。制約で区間の幅が列挙可能な大きさ(10^7)に制限されている意味はわかっていたつもりだけど、区間の上限が (10^7)^2 だということとその意味に気がついていなかった。十分な大きさの素数までを列挙すれば、1つの素数のべき乗(2,4,8,16……など)とすべての合成数(4,6,8,10,……など)が列挙できて、消去法で区間内に高々1度しか現れない大きな素数も見つけられるんだけど、「十分な大きさ」を決めるのは区間の幅ではなかったのだった。提出 #67224096 (AC)。■F 問題 Socks 4。N すくみ的な状況。手持ちの靴下を C→D(→E)→C と入れ替えて戻すのは必ずどこかで判断ミスをしているので堂堂巡に陥る心配はしないけど、問題設定がすこしでも複雑になると自己ループの除去とかできなくなる。■火曜日……2晩……。6月30日は ABC412 の代わりに消えた?


2025年07月01日 (火) すこし前に発表されたシマノのバッテリーレス自動変速。「「これ、アシストしてくれてるんですか?って聞かれたことがありました。でも違うんです。ギアが合ってるだけで、脚力だけで登れているんですよ、って言うとすごくびっくりするんです。それを知らなかった人にとっては、本当に新しい発見なんです。 僕らスポーツバイクに乗り慣れている人は自然と変速操作をやってるけど、普通の人はできないんですよ。 ちょっと重めのギアに固定してずっと乗ってる人、坂で軽いギアに変えれば良いのに降りて押す人、よく見ますよね。でもQ'AUTOなら、限られたパワーを引き出して、うまく走れせてくれる。これって実はすごいことなんです。」■これはちょっとわかる。小中高と自転車に乗っていて、3段変速、20何段変速とあっても、がんばってなんとかなるあいだはシフトダウンするよりもがんばってしまう。車とバイクの免許をとってから自転車の変速マナーが変わったのを覚えている。だってね、エンジンは自分と違ってちっともがんばってくれなくてすぐにエンストするからね、シフトダウンするしかない。それで自転車でもがんばる前にシフトダウンをするようになった。エンジンも人間もほどよい負荷でくるくる回すのが一番効率がいいし、特に非力な人間はそのゾーンが狭いのだから(エンストの話と矛盾してない?)、どんどん変速をするのがいい。


2025年06月21日 (土) [AtCoder] 今日はユニークビジョンプログラミングコンテスト2025 夏(ABC411)があった。F は解けても良さそうな気がするなー。■A 問題 Required Length。はい。■B 問題 Distance Table。累積和でやったけどその必要もない制約だった。というかね、累積和を作成するのと答えを出力するのが同時に行えるのだから、事前に累積和を作成するひと手間が完全に無駄だったよね。■C 問題 Black Intervals。左右の端に番兵(白石)を置くと境界条件が省けて便利。前後を合わせて石3つで3ビット(8通り)の場合分けを書いて1通りだけ間違えて1ペナルティ。私は具体例を出して数の増減が数えられません。■D 問題 Conflict 2。配点がやや上振れ。だけどひょっとして Ruby だとやるだけなのでは? と思って提出してまんまと TLE を食らいました (#66944990)。Array だと前後への要素の追加(unshift/push)でサイズが倍々的に増えていくからメモリの確保回数が節約できるのだけど、文字列の破壊的変更はそうではないのだろうか。Array には copy on write もあるけど文字列にはないのだろうか。それともそうであっても許されない制約だったのだろうか。前の要素を参照するリンクリスト的な構造を Q 個作成して、最後に逆順にたどって連結した。クエリを逆順に見て最終的に影響のあるクエリ2だけをピックアップできるかなとも一瞬考えたけど、一瞬で断念した。■E 問題 E [max]。最初しばらく勘違いしていたんだけど、余事象とか包含関係を求めやすさで整理した結果、答えを出すのに必要なものは、有効な面が0~6面のダイスがそれぞれ何個ずつあるかという集計。有効な面とは何か。たとえば最大値を X としたいとき、その確率は X 以下の面のみが出る確率引く X 未満の面のみが出る確率。最大値を大きい数から順に下げていくのにあわせて有効な面を減らしていき、その都度確率を計算する。期待値は最大値掛ける確率。答えが合わないので一度小数で計算して過程を表示するなどした。掛けるで繋げるべき計算を足すで繋いでいたのが原因で間違えていた。mod のままではそういうしょうもない計算ミスを見つけるのも難しい。2.5 秒かかったので制限時間が3秒で助かった。÷6^N をループの外に出してこれなので、もし2秒制限で TLE だったら、2,3,(4),5,(6) の N 乗までを前計算したりしたかな。あと、前後のループの後半と前半で確率の値が使い回しできそう。……ということは、ループ全体で足し引きを通算して再構成するともっと演算が減りそう。考察が足りなくて最適解が見えていない可能性。■F 問題 Contraction。制限時間が4秒。やや高の 525 点。辺をマージするだけなのかなと素朴すぎる方針を立てて実装したところ、およそ1秒で時間は間に合ったけど WA が多数 (#66981976)。必要な処理を抜かして時間を稼いでいる疑い。■■■F 問題。終了 12 分後に提出したものは WA×31 だった (さっきの提出)。翌朝目覚めたらデバッグが完了していた (#66988575)。頂点 a と b をマージして a が代表として残るとき、b とのみ辺で繋がっている頂点 c を a に付け替える。そのときに辺を a と c 双方に登録しなければいけないところ、a から生やす辺を忘れていた (30 行目)。やっぱり時間内(E 問題に 40 分かけたがまだ 30 分と少し残っていた)に解けてほしい難易度の問題だったけど、実際にはひと晩(≠ひと晩中)かかったなあ。解答に使った知識は UnionFind とマージテク。■今日ある第六回日本最強プログラマー学生選手権-予選-(ARC201)には参加しません。最初の2問が 500 点だけど、どう考えてもはりきった出題者が一筋縄ではいかないひねった問題骨太な問題を出してくるに決まってるんです。先週の ARC200 (div.2) の A 問題 (500 点) が解けなくてゼロ完だったことで私はいたく傷ついています。■■■D 問題。Array でやってもだめだった (TLE×13)。ちなみに String だと TLE×12 だったから、Array よりマシ。そして、クエリ逆読みをやってみたら WA×18 だった。「一瞬で断念した」だけのことはある。デバッグ完了 (AC)。それから最初の解法だけど、リンクリストのノードは Q 個ではなくクエリ2の数だけで十分みたいだった。クエリ1と3でコピーしなければいけない気がして自分は空文字列を追加した体で新しいノードを作ったんだけど、一度作ったノードは不変なのだから、参照をコピーしてノードを共有するやり方で問題なかった。


2025年06月14日 (土) [AtCoder] 今日は CodeQUEEN 2025 予選 (ABC410) があった。問題の傾向として JOI に近いのだろうか。典型的な基礎知識が確実に身についているかを確かめる感じ。だからってそれが必ずしも簡単なわけじゃない。DP ひとつとってもいくらでも難しくなる。難易度はともかく、DP は必ず押さえておいてほしい知識のひとつとか、発想より実装みたいな傾向を感じた。結果は、まるで進歩が見られない。自分だけ前に進んでいないのだからそれは後退と一緒。■A 問題 G1。数えます。■B 問題 Reverse Proxy。シミュレートします。■C 問題 Rotatable Array。rotate をシミュレートする代わりに先頭へのポインタを動かす。添字の1始まりと0始まりの差を埋めるために N+1 要素の配列を用意してサンプルが合わずにグダってしまった。正しい対処法は、N 要素の配列を用意して、先頭へのポインタの初期値を N-1 にすることだった。■D 問題 XOR Shortest Walk。先々週の ABC408-E「Minimum OR Path」の OR が XOR だったら……という仮定がコンテスト後に見られました。期待に応えて? 閉路でどうなるかなと思ったけど、チカチカするだけだった。「だけ」といってチカとチカとチカの組み合わせは2のべき乗で増えていくのだけど、それとは関係なく頂点数 1000 に対して状態数が 1024 なので、全部やって間に合います。1<<10 を計算して確かめたので間違いない(あまり見慣れない制約なので 10 ビットとゼロ3つの対応が思い出せなかった)。■E 問題 Battles in a Row。体力の高さと魔力の高さはトレードオフの関係にあるので、体力に対して最大の魔力を記録する DP をした。2乗が間に合う。ところで、「体力に対して最大の魔力を記録する DP」のどこが「体力の高さと魔力の高さはトレードオフの関係にあるので」なのかは判然としない。本当は「HP が低くなるなら MP は高くならないといけないよ」という DP をしようとしたのだけど、実装が混乱したので一旦すべての HP をフラットに扱う素直な実装を書いて、それをそのまま提出したのだった。■F 問題 Balanced Rectangles。対角を決めれば中身は数えられる。問題は対角の選び方が2乗のオーダーになること。どうやって効率良く数えるのかわかりません。短い方の辺の2乗なら許されるとしても、長辺方向の累積和で何もうまくできない。■G 問題 Longest Chord Chain。ABC402-D「Line Crossing」、ABC405-F「Chord Crossing」から続く3問目。おかげで問題の把握は容易。まずある弦を選ぶ。その右側と左側に対してそれぞれ平行な(平行になるように移動できる)弦が最大何本選べるかがわかればいい。これは再帰的に DP で求められる。わからないのは、左右にあるどの弦が再帰の次のステップとして最適か。これを逐次的に選ぶのでは全体で2乗のオーダーになって間に合わない。次のステップの候補が連続してすきまなく並んでいるのならセグメント木に載せて最適解を対数時間で選べるが、左右を分ける弦と交差する弦をクエリ範囲から取り除かなければ誤った答えを選んでしまう。ということを今この日記に書いていて思ったのだけど、交差する弦をセグメント木から一時的に除外することが可能なのではないか。除外したり復元したりの回数は全部で 2N 回なのでは? この思いつきを実装しようとすると、弦に対して交差する弦のリストを作成すること、再帰の末尾に当たるどの要素からセグメント木を埋めなければいけないか、範囲の左右を分ける区切りとセグメント木の先頭末尾の区切りの不一致から扱う範囲が実質的に3つになることなど、気が遠くなるほど道のりが長い。2乗の解答を書くだけですでに疲弊しているというのに。しかもこの2乗の解答が (TLE に加えて) WA を出す可能性が6、7割くらいあると思ってるよ。それだけややこしいし、方針にも確信が持てない。■■■F 問題。この累積和の使い方、解いたことある。ABC338-G「evall」(「範囲の両端が + の内側にある場合の寄与は、これは累積和の問題として単独で D 問題あたりにでもなりそうな難易度の問題」)。次元がひとつ増えるだけでキャパシティをオーバーして、できることとできることの足し算ができないことになってしまうのでした。提出 #66801656 (TLE×20/AC×23)。ダメです。


2025年06月12日 (木) 舞洲万博P&R駐車場の待機場における自動運転バス車両のコンクリート擁壁接触事故の原因と今後の対応について|Osaka Metro」■「[B! 事故] 万博・自動運転バス事故『原因=車両が受信できない速度(500kbps)でデータ送信していた』大量のエラーデータで必要なブレーキ情報伝わらず…大阪メトロ | MBSニュース」■電動(?)パーキングが作動するための条件の1つであるフットブレーキ操作の記録が押し流されて確認できず、結果としてパーキングブレーキが作動しなかった。アクセルブレーキハンドル操作は普通にできる状態だったが、パーキングブレーキに穴があった。「当該車両の運転士が車両のパーキングブレーキシステムをオンにし、待機場停車時にフットブレーキ操作を行ったにもかかわらず、パーキングブレーキが有効に作動しなかった」ときにどんなフィードバックがあったのかなかったのか。これはブレーキをかけることとブレーキがかかることが一致しなかった例。自分は古い人間なのでこの2つがワイヤーで直結している(力学的)システムが好きです(大型車両で補助動力がうんぬんはおいといて、自分が乗る車は)。ちなみに自動運転のエラーではなく手動操作中の事故。しかし原因は(車内の?)通信ネットワークにある。


2025年06月07日 (土) [AtCoder] 今日は AtCoder Beginner Contest 409 があった。■A 問題 Conflict。縦に見て ○○ を探す。■B 問題 Citation。1回間違えて愚直二乗解法で書き直した。与えられた値の中に答えがあると思い込んだわけではないのだ。それも想定して、でも反例が出てこなくて間違えた。とても難しい問題。以前から書いてるけど、否定で定義される MEX みたいな問題が苦手。問題名は引用かなと思ったけど意味がわからない。調べたら召喚状、出頭(罰金)命令書、賞状といった意味が出てきた。意味があまりにとっちらかっている。形式に対する名称なの? なんにせよどれもしっくりこないような。■C 問題 Equilateral Triangle。円周 L を3等分して L/3 個の三つ組の掛け合わせの和。■D 問題 String Rotation。まず先頭に近い方から前後ペアを見つける。どのような。前後が大小の順番で並んでいるペア。次は見つけたペアの大きい文字をどれだけ後ろへ送るかを決める。より大きな文字の前か最後尾。■E 問題 Pair Annihilation。焼きなまし?(問題名←それは annealing こちらは対消滅) F 問題より考えた。最小全域木的な操作や重み付き UnionFind を考えたけど、うまくない。葉からの DP (with マージソート)を考えたけど、うまくない。実は葉から貪欲にペアを作っていくのが最善だった。それがわかればあとはがんばって書く。■F 問題 Connecting Points。2乗が通るのでやるだけですか? TLE×3 だった(#66577100)。もうええやないですか。通してください。できることはもうやってるんです。プライオリティキューに無駄要素が詰まりがちだから、値が重複しないように気をつけました(プライオリティキューにはユニークな距離の値だけを入れ、距離に対応した頂点対リストは Hash に入れた)。新頂点を追加するときに点間距離ではなく連結成分対新頂点の最短距離をソートによらず選び出すことでさらにキューに入れる要素を減らそうとしたら、これは遅くなりました(TLE×7)。お手上げ。


2025年06月05日 (木) CD2WAV32 for Windows11 Revision 4.00jpをリリースしました – 新しい経験の日々の記録」■4月に6年ぶりに CD を買ったので旧バージョンを利用したところ。2月に Vista から 11 に移行したので 11 対応はいいタイミング。次 CD を買うのが何年後か知らないけども。


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