/ 最近 .rdf 追記 設定 本棚

脳log[2024-11-09~]



2024年11月09日 (土) [AtCoder] 今日はトヨタ自動車プログラミングコンテスト2024#11(AtCoder Beginner Contest 379)があった。いい日ではあったがそれはつまり6問目まで解ける問題が並んでいたということであり、えっと、退屈な問題セットだったということなのでは? 退屈な問題しか解けないのが私です。■A 問題「Cyclic」。標準入出力が扱えますかという問題。AtCoder 初参加の時は知らなかったからリファレンスを引いた。■B 問題「Strawberries」。前から貪欲に。■C 問題「Sowing Stones」。難しい。N 個のマスを順番に処理することができないのが難しい。石の入ったマスに着目して計算で石を配らないといけない。計算というのは等差数列の和。N マス全部を埋めなければいけなくて、石は右にしか配れないから、右の方にある石の山から順番に、現在右から何マス目まで石で埋まっているかを記録していった。右から隙間なく敷き詰めていくことしかできないからね。これを左側から処理しようとすると、いろいろと保留するものが出て来てややこしいと思った。13 分かけて書いた最初の提出が WA だった。問題文を読み直したら「ちょうど」って書いてある(「N 個のマスすべてに石がちょうど 1 個ずつ入っている」)。石が余る場合に間違えていた。修正に5分。N マスすべてに石が配れるかは確認済みなので、石の総数が N であることをチェックするだけ。ペナルティ込みで 23 分かけた計算。難しいよー。■D 問題「Home Garden」。一転して簡単な問題。配列(生配列とポインタペアで十分)に植えた日を記録していく。収穫は先頭から順番に。4分半。■E 問題「Sum of All Substrings」。かつての ABC-D 緑 diff って感じの問題。まず、余りを取る問題でないことに驚いた。えっ。64 ビットに収まるんですか? (サンプルを見て)収まらないね。1の位から考える。S の各桁の数字は1の位として何回活用されるか。10 の位、100 の位としては……。繰り上がりも考慮して決めていく。提出までおよそ 30 分。書く量は 252 バイトでもすらすらとは書けない。■F 問題「Buildings 2」。よみがえる ABC372-D「Buildings」の悪夢 (「脳みそがスポンジ化している」「番狂わせの D 問題」「提出するまでほぼ1時間ぐだぐだやっていた」「問題が全然頭に入ってこない」「いったい何を数えるんだよー」「"ビル i とビル j の間にビル j より高いビルが存在しない" という i と j のペアを数えるんだけど、えっとね、i のビルの高さはなんにも関係ないんだよ」「理解したら実装は5分」)。慎重に問題とサンプルを読んで理解に努めた。基本的には自分自身を起点とする増加列を数えておけば良さそう。自分より低いビルも見ることができるんだけど、r より低いビルを l から見ることはできないので、それは数えても意味がない。l と r の高低にかかわらず r から見える r より高いビルの数が答えの候補になる。あと考えることは、l から r が見えない場合。答えはゼロではなく、あいだにある最も高いビルから見えるそれより高いビルの数が答えになる(この条件は r が最も高いビルである場合もカバーするので場合分けが消える)。ランダム入力と愚直解法からこのケースを見つけた。ABC372-D の記憶によって数えるべきものがはっきりわかっていたから、見つけたケースの解釈で迷うことがなかった。あとは増加列を数えるのに LIS をやるポカをした。スタックを1本持って長さを数えるだけでいいのはさっき挙げた Buildings と同じはずなんだけど、なんで同じにできなかったんだろうなあ。最初の提出 #59612302 (WA) を書くのに 20 分かけて、デバッグに 20 分かけた。提出 #59621904 (AC)。■G 問題「Count Grid 3-coloring」。10 分も残っていないので問題を読むだけ。左の数字と上の数字を参照して1,2,3の場合の数を数える DP かなと思ったけど、制約が3乗を許容しているし制限時間も長めの3秒なので、何かが抜けているか全てが間違っているかのどちらか。■コンテスト成績証。青パフォ 1763。■あっ、F 問題の問題名が Buildings 2 だ! そうか、問題名で自己言及していたのか。■■■C 問題。左にある石の山から処理をしようとするといろいろ保留することになって面倒そうと書いたけど、実際には左からやった方がシンプルになった。提出 #59709275 (左から / 204 Byte)。提出 #59582960 (右から / 280 Byte)。


2024年11月02日 (土) [AtCoder] 今日は AtCoder Beginner Contest 378 があった。解ける問題が当たり前に解けなくて無駄に WA を重ねた。実装が下手!■A 問題 Pairing。Array#tally を使うところまでは良かったけど、同じ数が4個ある場合、2個3個ある場合と場合分けをしたのが制約に甘えている。個数を2で切り捨て除算したものを合計するのが正解。他の人の提出を見てこの式は頭が良すぎるだろうと思ったけど、なんのことはない、それが当たり前のやり方だった。作れるペアの数を数える問題なのだから。■B 問題 Garbage Collection。10 分かけました。1つの式でパッと答えを出したいと思ってあれこれやったけどだめだった。ステップを踏んで数えた。■C 問題 Repeating。問題文が難しかった。「Ai​ と等しい要素が i の直前に出現した位置を Bi​ とする」とあったが、等しい要素を A 数列から探すのか B 数列から探すのかわからなくてフリーズしてしまった。サンプルで理解したけども、読み飛ばして「より正確には」以下を読むのでも理解できた。だけどそこまでたどりつかずにぐるぐるとスタックしてしまった。わかれば値の範囲を見て Hash でメモ。■D 問題 Count Simple Paths。計算量で難しさを出してくるのが D 問題というイメージなので、愚直 DFS が通るのは甘々です。だけど BFS は書けるけど DFS はなんか苦手という時期が自分にもありました。■E 問題 Mod Sigma Problem。解けてないよ。6問解く実力がなくて F 問題が 25 点だけ上なら F 問題を先に解かない理由がないよ。■F 問題 Add One Edge 2。単純グラフというのは自己辺なし多重辺なし。単純グラフというのは自己辺なし多重辺なし(2回目)。問題文を読んでるときにこの通りに補完しているが、ABC なんだからそこまで書いてもいいと思うんだよね。知らなきゃ解けないという問題は門前払いされたようで面白くないよ。それが概念でなく単なる言い替えレベルの用語がどう定義されているかというだけのことであればなおさらしょうもなくて面白くない。次数2の頂点同士を結んでその LCA までのパスがすべて次数3であるか、LCA が次数2の頂点の一方であるかという場合を数える。とにかく実装が下手だった。WA (隣接している次数2の頂点を結んでしまっていた。それは多重辺)、WA (葉を刈り取る DP をしているのに処理順が LIFO だった。20241019と同じミス。手癖で書いてるんじゃないのよ。pop かな shift かな pop でいいよねと考えた結果なのが救われない)、WAWAWA (葉を刈り取る DP をしているのだから、1を仮の根としたときの親に処理を流すのは間違いなのよね。この場合の根とは最後まで残った1ノードのことなのだから。一番深いところから積み上げる DP なら間違いではなかったし、脳内イメージではそうしていたんだけど、実際にやってることがちぐはぐだった)、AC (再帰関数で再実装したら AC だった。だって何度問題を読み直してももう考えることが残っていなかったので、原因がわからなくても実装が悪いことが明らかだった)。■レートは横ばい。デバッグとペナルティで失った 50 分が痛い。■■■精進。E 問題。累積和とか転倒数とか BIT とかのワードを見かけてもいまいちピンときていなかったが、ある動画でエスアールヒクエスエルが負と聞いてやっとやるべきことがわかった。それを正しくやるのにも散々迷走して凡ミスをして苦しむんだけど。提出 #59430244 (AC)。■■■精進。水 diff ながら抜けていた ABC221-E LEQ。さっきの E 問題を解いたあとだと普通に解ける気がして、普通に解けた。提出 #59440817 (AC)。ABC378-E とは類題ってことでいいのでは? 自分は感覚とかイメージとかのふわっとしたもので問題を解いているので(○○の△△は二分探索(を疑う)みたいなトリガーを記憶しておくことも適切に引き出すこともできなくて、二分探索の雰囲気がするから二分探索をしている。例「二分探索っぽさがあるよね」)、式を操作したり式を見て糸口を見つけるということが苦手というか、まったくアプローチができていない。そういう苦手を突くという点で類題だと思った。この問題では2の冪乗というものについて、足し合わせてみたり、足し合わせたものをまとめて割ったりするとどうなるかな、何の問題もなく個別に計算したのと同じ結果が手に入るなということを確認するだけで解答が書けた。昨日まではそれができなかった。ある範囲の連続部分列の和が Sr-Sl であると、それが mod を取ったあとだとどうなるか、それをどうするかと考えてみることができなかった。そういうアプローチが存在していなかった。


2024年10月27日 (日) 【速報】自民・麻生太郎氏「物価が上がり始めた。それで給料も上がったろ?間違いなく、政策が当たったからだろうが!」 → 聴衆から歓声 : 暇人\(^o^)/速報 - ライブドアブログ」■円の価値が薄まって取引される額面はたしかに上がったかもしれないけど、預貯金の額は変わらないし、賃金の上昇も追いつかないし、デフレに応じた賃下げができないからって、代わりに円の価値を下げただけじゃないですか。じゃあやるべきではなかったかというと、自身の価値を現在の相場で額面にかえられる現役世代の方がリタイアした人より有利な立場にあると思うんだけど、どうなんだろう。よくわからないでテキトー書くけども、株式分割を繰り返したライブドアのまねをするなら円を刷り続けるのもいいんじゃないの。価値と額面が調整されて均衡するまでの時間差で短期的には錬金術が成功しそう。錬成するのが金であれ紙幣であれそこらにあふれたものを欲しがる人はいずれいなくなるだろうけど。まずは日本人が円を危険資産とみなして欲しがらなくなるよね。もうなってるか。


2024年10月25日 (金) ユニコーンオーバーロードを続けて2回クリアした。1回目はタクティカルで始めて途中からエキスパートで、2回目は難易度ゼノイラで。やることがわかっているぶん2回目の方が簡単に感じることもあった。アイテム5個まで制限があるけどもとから使っていなかったし、ブレイブがたまりにくくなるらしいけどブレイブスキルは完全無視だったので、この2点では実質的に難易度による変化はなし。でもアシストを先に始末するとか、やるべきことをきっちりやらないとひどい目に遭う厳しさはあった。拠点回復が貧弱だから各ユニットで完結する継戦能力が大事。ダメージを食らわなければ死ななければ食らっても回復できれば、判定勝ちの次でとどめを刺せる。そしてスタミナがいつでも枯渇する。拠点・橋・たき火・見張り台駐留とスタミナ0ユニットスイッチを駆使しても足りない。他には防盾を自前で置いたりオーバンのブレイブスキルを使ったりする手があったらしい。一人だけ頭身がおかしいオーバンさんはレックスブルーノソードマンともども全然使わなかったな。なんだかんだ 140+110 時間くらいプレイしてたみたい。フリーバトルは初回しかやらないけどサブも拠点解放も全部やる。それで1回目も2回目もクリアデータのレベルは 44 だった。レベル差で経験値キャップがあるから同じレベルに収束するみたい。感想はひとことで言うと、大きいです(それと見え……)。あの大きさが世界に平和をもたらします。薔薇騎士団のつつましさもそれはそれで。■他に書くことがないよね。体験版では編成のしにくさを感じたけど(時限式の体験版は編成画面ではタイマーが止まる仕様らしくて実質的なリミットは倍以上だった。そんだけ編成をやっていた)、どこをどう修正したのか製品版は快適だった。UI もそうだし、直観的で無駄のない操作もそう。やりたいことがかゆいところに手が届くレベルでできるようになっていて、なおかつその機能に最低限の操作で思い通りにアクセスできる。戦闘が(初期パラメータのみに依存して)決定的で予測可能なのも良かった。ダメージ量が 10 % 増減するとか、5割の確率で毒にするみたいなファジーさがなかったということ。それに関連して良し悪しだと思ったのは、アシスト射撃が実質的に乱数ガチャになっていたところ。アシストなしで普通に勝てるんだけど、アシストをありにするとこちらが全滅したり、そこまで極端ではなくても被ダメージが増えたりということが当たり前にあった。アシストしてないんだよなあ。編成では色んなコンセプトを考えることができて、どれもだいたい通用する相手には通用するのが良い。だけどオールマイティはなかなかないし、序盤中盤終盤で利用できるクラスとスキルと装備に応じて最適な編成も変わってくる。具体的にはお馬さんが序盤に馬鹿強くて、でも次第に勝てなくなってきて、そこで改めてお馬さんの強さを引き出す編成を考えると、やっぱり強かったということがあった。ライトニングシェイカー(槍)が強いだけという説もあるが。ウッドペッカー(弓)の多段ヒットが気持ち良くてそれだけの理由で使い続けてたりも。あれはヴァルキリープロファイルでコンボを起動する浮かせ技だね。要は、使いたいキャラがいて、そのキャラの強さを引き出す編成を考えれば良い。どのクラスにも強みがあり活躍させることができる。もちろん強さや使いやすさに差はあるけど、キャラへの愛で無視できるレベルにとどまっている。アイコンについても書きたい。世にあるアイコンやピクトグラムというものを自分はテキストに添えられた賑やかしとしてしか認識していなくて、それぞれを識別することもできないのだけど、このゲームのアイテムに添えられたアイコンは、テキストと同じか、ときにはテキスト以上にアイテムを見つける役に立っていた。これはすごいことだと思う。最後に、オクリースさんのまっすぐな愛がまぶしい! 話題の当人がいないのに、あ、はい、あの人のことですよねって話の先が読める。■まとめで読んだことをふまえて編成について書く。1回目で騎馬隊と歩兵部隊の進軍速度差に悩まされたので2回目は歩兵リーダーはなし。騎馬リーダー3ユニットにグリフォンリーダー1ユニット、弓リーダー2ユニットだった。あ、弓は歩兵だ。アシストしたいから弓は歩兵でもリーダーにするしかない。リーダーの途中交代は面倒だからやらない。騎馬リーダーの中にアレイン騎馬隊とベレンガリア(姉貴)隊とヴァージニア隊がある。グリフォンは一時期後列攻撃用に各ユニットに分散させていたけど、だいたい一番最初に射殺されて転がっていたのであとでまとめてしまった。1回目はブレイブスキルもアイテムも使う機会がなかったけど、ファストエール(移動速度アップ)の存在を知った2回目では使わずにいられなかった。ファストエールはグリフォンのブレイブスキル。バトルシーンの再生も、1回目は前後をオーバーラップさせながらサクサク進行している印象だったのが、2回目で倍速再生を覚えてからはスローモーションにしか見えなかったので常に R2 ボタンを押していた。姉貴が使えるアトラクトで見張り台のアシストユニットが釣り出せるのは最後まで気付かなかった。アシスト射撃はグリフォンの天敵なので少しは楽になっていたかも。弓兵が弱いと書かれていたのが意外だった。1回目も2回目も弓とグリフォンと魔女だけは砦で雇用していたぐらいなので。弓クラス各種をリーダーにして比較したら、アシスト射撃の威力を決めるのはスキルなしの素の物理攻撃力と会心率だと思ったから、凍らせるとか魔法攻撃混じりだとか盾持ちだとかの余技なしで純粋に物理ダメージに特化している弓兵が一番強いと思った。1回目はクロエに指輪を渡した。他に渡せるキャラがいなかったから。ソルジャーは投げれば飛行に刺さり突けば馬と後列に刺さり、そして会心率 100 % の列バフがワイドチャンスと合わさって自前で必中化できるグリフォン部隊の強化に最適だった。ただし難易度ゼノイラでは器用貧乏でダメージが通らずシャープエールとライフエイドにしか用がなかった(それでも用はあったのだ)。これも最後まで気付かなかったんだけど、隠れている敵ユニットを見つけるという地味な主効果に紛れて 命中+50 みたいに重要な効果を持ったアイテムとブレイブスキルが存在していた。なんなら隠れている状態というのが最後までわかっていなかった。獣人ユニットがハイドでマップ上から消えるのとはたぶん違うんだよね。バリスタから隠れられるとかグリフォンは飛んでるから隠れられないとか、そういう要素が存在していたらしい。なんかときどき範囲内なのにアシスト射撃できねーんだけどと思っていたのもたぶんこれ。森は騎馬が遅くなるだけではない(らしい)。序盤は手数が増えるのが嬉しいけど、それがダメージ1や空振りでは意味がないのでチェイスとカウンターは信用していなかった。ミスティックセイバーで強化できたらしいが、エルフも獣人もほぼ使わなかったので……。1人書いている人がいて自分も心当たりがあったことに、モブ雇用の名前がある。1回目と同じ名前の魔女を雇用しようと思ったら選択肢になかった。勘違いかと思っていたけど、今1回目のデータを確かめたらそうではなかった。どういうことか。1回目のプレイではデボラというモブ魔女を雇用していたのだけど(クリア済みデータをロードして確認済み)、2回目のプレイでは名前の一覧にこの名前がなく、進めていくと敵勢力の魔女がデボラという名前を名乗っていたのだった。アップロードされていたスクリーンショットでも同じ敵がデボラを名乗っていることが確認できたので、つまり、どういうことなの? 敵とモブ雇用で名前の取り合いがあるってこと? 敵勢力にもユニーク名持ちとモブ雇用の2種類があるってこと? たしかに砦周辺ではそういう会話がよく見られた、そういえば。あっ、要するに、デボラさんはモブだけどモブとして傭兵として固有の動きを見せていて、ゼノイラ軍を御役御免になってからでないと解放軍に雇用されないってことなの? そいつは……細かい。これもまとめを読むまで知らなかったけど、乙女の指輪を特定の相手に渡したあとで親密度会話の3を見たとき、それがアレインくんの浮気判定にひっかかってしまう内容のものだった場合は、自己検閲により現実が歪められて夢落ちにされてしまう仕様があるのだった。これも細かいといえば細かいんだけど、アレインの誠実さを描写する意味は小さくなかった。話は飛ぶが、攻撃役と防御役が信用していいステータスは攻撃と防御の数字だけです(それと飛行特効と騎馬特効)。割合でかかるバフの基礎になる数字なのでバフの効果量にも影響する。反対に信用できないのがまずはガード率。ブレイカーをはじめガード不可の攻撃がそこそこあるし、パプーを戦闘開始時に吹かれると雑に全部ガード不可になる。ガードによる割合軽減を考慮しない素の防御力しか信用できない。命中率もイヴェイドなどの回避スキルがあるし(地上から)飛行系を相手にするときには半減してしまうので当てにできないし、対策で必中を付けるから数字を盛る意味がない。同じ理由で回避率も当てにしない。必中攻撃は必ず当たる。必中攻撃にも対策はあって、暗闇凍結気絶などで当たらない動けない状態にすればいいんだけど、デバフがかかっていること解除されていないことにキャラの生死を預けるのは不確かなので、防御力の数字しか信用しない。カバースキルなどで防御の数字自体を当てにしない配置というのはもちろん考える。さっき挙げなかったけど素の会心率はアシスト射撃に効く。でもたぶんリーダーの会心率だけかな? 弓リーダーの会心率は眼帯で 100 に近づける。■3回目を難易度ゼノイラでやるとしてどういう縛りが楽しいかなと考えていたんだけど、スキル装備縛りとかわりと良さそう。装備スキル縛りなんて中途半端ではなくスキル装備縛り。ライトニングシェイカーなしでナイトはどうするとか、ローグの PP は腐らせるしかないのかとか考えさせられる。序盤にトゥルースピアの必中技が使えないとハンターのイーグルアイが欲しくなるはずで、装備スキルで補えない分よりクラスを意識した編成が求められると思う。ちょっと考えたところでは乙女の指輪はホワイトナイトのラインバリアで代用が利くんだけど、バルトロにとどめを刺す手段がなくなりそう。あいつ何回殴っても HP1 から減らない。ノーマルエンド確定か。スキルが付いているせいで装備できなくなるものにどういうものがあるかな。■書き忘れ。1回目は成り行きでクロエに指輪を渡したけど、2回目は同じユニットにいる時間を長くしてヴァージニアに指輪を渡せるようにした。気持ちのいい性格をしてるし、何より声が好きだった。エンドオブエタニティのために PS3 を買ったときからのファン。というかどちらがというのでなく、あの声であの性格なのがいけない。戦闘中のかけ声をずっと聞いていたい。デバフ無効の装備が手に入る終盤まではガードはするんだけど状態異常でふらふらしていることがしょっちゅうで、ふらふらリフレッシュふらふらリフレッシュと、おきあがりこぼしよろしく敵味方双方からいいようにもてあそばれているような弱いところもまた良かった。


2024年10月21日 (月) 先日のお風呂では(デバッグのネタもなかったので)つらつらとガス灯のことを考えていた。何の本で読んだか忘れたけど、たぶん 19 世紀イギリスの生活に関する本なんだけど、ガスが通ってるパイプの口に火をつける、みたいなことが書いてあったようななかったような。ほとんど覚えていない。それに加えて、ガスの口に息を吹き込むと隣の口の炎が大きくなったり、みたいな記述もあったような気がして、そのあまりの原始的な仕組みに驚いてしまった印象だけが強い。だけど現代社会のインフラも根っこの部分は似たようなものかなとも思う。年中(年度末に?)地面を掘り返してるのがそういうことなのでは。自分としてはそうやって火をつけるとパイプの中のガスが一度に燃えてしまって大変なことになるような漠然とした不安を覚えるんだけど、そうはならないらしいということは、つまり、酸素がないということなのかなと思ったり。ガスって炭化水素かな。たしかに酸素はない。火薬はこれとは違うはずで、というのも、火をつけた花火は水の中につっこんでも燃え続けるからなのだけど、そういえばピクリン酸みたいなかわいいけど敏感そうな名前の化合物をはじめ、爆発するものには N とか O とかがくっついていた。やつらは酸素を自給できるからやばいの? 義務教育の敗北と言われかねない当たり前のことだったり、あるいはまったく間違ったことを書いていたりしていないかというおそれを持っているんだけど(今です)、案外普通の人間はこうだという開き直りもある。一を聞いて十を知るみたいな人間は1%以下の天才に限られた話で、普通は一から十まで聞いて三わかれば上等ですよ(そして下を見れば十まで聞けない人間や聞いてもいないし合ってもいない理解を得てしまう人間にあふれている。自分はそれを行間しか読まないと表現した)。つまり、化学式は化学式として、数式は数式として習いますけども、その意味を解釈したり現実世界に当てはめたりはできないのです。それが普通。教わってないことは(教わったことも半分以上は)わかりません。教わりませんでしたよ。■答え合わせ1。「ガス灯 - Wikipedia」から「イギリス人技師のウィリアム・マードックが、自分の小屋で石炭から出るガスによる照明の実験に成功[1][2]。1797年にはイギリスのマンチェスターでガス灯が設置された[2]。」「初期のガス灯は、直接火口から火を点灯し、炎を直接明かりとして利用するものだった」「19世紀半ばには一般家庭の室内照明としてもガス灯は普及していたが、当時のガス灯は爆発の危険もあり室内の使用に適したものではなかった[5]。」 19 世紀。イギリス。爆発するっていうのは、口を閉め忘れたり火が消えたりで室内にガスが漏れた結果なのかなと思う。■答え合わせ2。「可燃性ガスが爆発する濃度の基準は?爆発範囲の一覧と安全対策も解説 | 計測・測定器のレンタルならソーキ」から「可燃性ガスとは、空気中または酸素中で容易に燃焼する気体」「可燃性ガスと空気の混ざった混合気が着火によって爆発する最低濃度が爆発下限界、最高濃度が爆発上限界です」 空気中または酸素中で。爆発上限界。燃焼ではなく爆発についてだけど、爆発する濃度に上限がある。ガスが濃すぎても爆発しない。■答え合わせ3。「酸素バランス - Wikipedia」から「酸素バランス(さんそバランス)とは、火薬や爆薬の組成が完全に酸化されるために必要な酸素原子が、火薬の組成中に元々含まれているかどうかを見る指標である。火薬や爆薬の組成中に、火薬を完全に酸化するよりも多い酸素原子が含まれていれば酸素バランスはプラス、少なければ酸素バランスはマイナス、同じであれば酸素バランスはゼロと表現される。」「火薬学では酸素が余るように配合するように指導している。 」 火薬というのがそもそもそういうものだった。そのようにデザインされている。今の今までそれを知らなかったんですよ。ところで火薬学って初めて聞いたんだけど、なにか兵法にも通じる古めかしさとかっこよさを感じる。発破技士というワードも関連に挙がっていた。かっこよすぎ。してみると「はっぱをかける」ってそうとう物騒な物言いだ。尻に火をつけるくらいにとどめておこう。ところで、昔の子供はカエルの尻に詰めた爆竹に火をつけて遊んだと聞きました。なんだじゃあ一緒だな!


2024年10月19日 (土) [AtCoder] 今日は ABC376(Promotion of AtCoder Career Design DAY)があった。自分のすべての提出。配点からは ABC が上ぶれで DEF はそれなりで、G が難しいと予想される。では A から E まで。■A 問題「Candy Button」。入力が時刻の列だということで前後の時間差に変換する必要があるのかな嫌らしいなあと反射的に考えたけど、まったくそんなことはなかった。最後にあめをもらった時刻を記録して数える。■B 問題「Hands on Ring (Easy)」。数えるだけ。他方の手が邪魔をするので時計回り反時計回りのどちらで数えるかが必ず決まっている。■C 問題「Prepare Another Box」。気持ち的には大きいおもちゃから優先して大きい箱をあてがいたい。あぶれるおもちゃを記録してそれが1つだけならその大きさが答え。それで良さそうに思えるけどやや自信が持てなかった。気持ちを強く持って提出!(これはダメなやつ)■D 問題「Cycle」。1から BFS をして1に着くまで。自分が BFS を書いていると知らなくて Array#pop を使ってしまい(Array をスタックとして使ってしまい)、1ペナ。キュー(Array#shift)でもスタック(Array#pop)でもどちらでもいいと思ったときは短い方(pop)を使うため。■E 問題「Max × Sum」。A 数列から選ぶ最大値も、B 数列から選ぶ K 個の和も、小さい方が良い(ここで制約が1以上であることを確認)。まずは A 数列から選ぶ最大値を固定しましょう。ソートして K 番目以降が最大値としてありうる値。最大値を決めたら、A 数列のうちそれ以下の値を持つ要素の添字が自由に使えるので、B 数列から選ぶ K 個の和が最低になるように添字を選ぶ。プライオリティキューを使った。補足。「以下の値を持つ要素の添字が自由に使える」は文字通りの意味で、未満の値の添字のみで B 数列から選ぶ K 要素が最小になるなら、A の最大値をより小さく固定した別のターンが答えを出すので心配ない。これは ABC116-D「Various Sushi」からの学び (「難しいなこれ。ある時点のループにおいてベストを求めなくていいし不正確でもいいということを見極めて受け入れるのは」)。■F 問題「Hands on Ring (Hard)」。案外状態数は少ないのかなと思った。LR がこの並びで隣接している場合と、RL の並びで隣接している場合と、離れた位置にある場合の3通り。でもこれは WA だった。離れた位置にある場合の元になる状態が LR、RL、離れの3通りあるのだから、すぐに3通りでおさまらなくなる。しかし一方の手が直前のクエリにより固定され他方の手としてありうる位置が 2999 通りまでなので、高が知れているとも言える。しかししかし、点から点への遷移は大変な苦労をして書いたけど、線から線への遷移は書けなかった。


2024年10月17日 (木) 「ながくのびたいすのかげ(長く伸びた椅子の影)」を「ながぐつのびたいす」と読んだ人がいたなあ。びたいすって何?


2024年10月14日 (月) [AtCoder] お風呂デバッグ完了しました。精進。おとといあった ABC375-F Road Blocked。E 問題が WA/TLE だったのを見てから 21 分で実装したものが WA だった。考える要素がほぼない典型問題でさえ得点できないなら俺の得点源はどこにある?■制約から多重辺なし、自己辺なし。頂点数の制約からワーシャルフロイド法によって全点間距離を求めることができるので、クエリ2に答えるのは一瞬。クエリを逆向きに見れば、辺が不通になるとは辺が新しく利用できるようになること。あるクエリで不通になった辺が以降のクエリでもずっと不通であることはサンプルをよく読んで確かめている。ワーシャルフロイド法をちょっと修正すれば、ある辺を必ず使う場合の最短距離を更新することができる。具体的には3重ループの最外ループが司る中継点を a または b に固定する。順番にやってもいいと思うけど、自分は同時にやった。中継点が a ならコスト c を足して b にワープさせる。逆向きのワープも同様に。そして中の2重ループが司る始点と終点がそれぞれ s と t のとき、D(s,a)+c+D(b,t) もしくは D(s,b)+c+D(a,t) が最短距離の候補になる。D 関数についてはいちいち書かない。■WAAC の差分は1行だけ。新しく利用可能になる直通辺が a-b 間の最短距離であるとは限らないという当たり前のことが抜けていた。どこから勘違いが生まれたのか想像することができる。ワーシャルフロイド法を実行する前、2次元の表 D[N][N] は直通辺だけが記録されたグラフ表現の一種だった。3乗のアルゴリズムを実行することで辺を辿った結果を含む最短距離の表に更新されるのだけど、自分の頭は更新されていなかった。クエリ1を実行するとき D[a][b]==INF だと考えてしまっていた。考えなかったわけではなく、勘違いしていた。無条件に c 書き込んでいいのか一瞬考えて、問題ないと判断していた。■無向グラフにワーシャルフロイド法を使用するとき、ループの回数を半分にすることで TLE の可能性を減らすことができるのは、ABC369-E を通して刻み込んだ学び (20240831)。■C 問題と E 問題についても書きたいけど、まだ解けてないので書けない。■精進2。ARC185-A mod M Game 2 (緑 diff)。すぐにむりむりわからんと投げ出したくなるけど、緑 diff だというのをもう知っているし、テストケースの多さからもシンプルに解けるのがわかる。ちょっとこらえて視覚的に考えてみると (M おきに印が付いた数直線にそって場のカードの和を表す棒グラフが伸びていくイメージ)、そのときどきで出してはいけないカードが高々1枚しかないとわかる。N<M だしね。最後の1枚になるまではどちらも絶対に負けない。2N 枚のカードの数の和で Bob の負けが判定できる。これだけではサンプルが合わなかったのでまだ考える。Bob が最後の1枚を決め打って温存するなら、Alice が N 枚目のカードを出したときの場の和を Bob が N 通り選ぶことができる。その N 通りに M の倍数が含まれるなら Alice を負かすことができる。Bob はその1枚を最後まで温存できるのだろうか。できるに決まってる。出してはいけないカードはあるけど出さなければ負けるカードはない。そんな当たり前のことも確認しなければわからない。提出 #58815966 (AC / 121 Byte)。かけた時間で判断すれば 300 点問題。事前知識を考慮して高めに見積もっても 400 点。<追記>できるに決まってはいなかった。2枚持っていて一方が出してはいけないカードならもう一方を出すしかない。温存できるの?</追記>■精進3。ARC185-B +1 and -1 (水 diff)。右の要素の高さを左に寄せることで右上がりの坂を作る。右に寄せられるなら何の問題にもならないけど、左にしか寄せられない。制約から判断して要素を左から見ていくことにする。二度見三度見は許されない。ネックになるのは、均した結果がある高さになるとしてその右側がへこんでしまうのがいけない。そのへんをうまくやるために4つのパラメータを記録した。すなわち、(現在の要素までの総和、均してもこれより低くできない高さの最大高さ、その位置、その位置までの総和)。提出 #58816249 (WA / 294 Byte)。A 問題から 31 分でまずは WA。提出 #58816379 (AC / 295 Byte)。その修正に 15 分。小なりを小なりイコールに修正した。文字にして初めて思ったけど、なんで小なりと equal がくっついてひとつの言葉を作ってるの?


2024年10月13日 (日) 【悲報】米の値段、下がらない : 暇人\(^o^)/速報 - ライブドアブログ」■お米を経済原理でしか考えられないコメントにもやもやする。米でも芋でも知らんけど、国民を飢えさせないセーフティネットの役割を国には期待している。すべてをアウトソースして海が遮られたらどうなるのか。高ければ食べなければいいではない。それは嗜好品の話だ。飢える人が出ないように生産者を確保して低価格を維持するために補助金を使うのは、目的として真っ当だと思うんだよ。脆弱性を突かれるまでセキュリティが顧みられないみたいなのと似た話なの?


2024年10月12日 (土) ヒゲ剃りにまったくこだわりがない。週一くらいの頻度でお風呂で剃っている。おもちゃみたいな電動シェーバーを使っていたこともあるけど、以後はこれまでのところ使い捨ての T 字がよろしい。高級機はどうか知らないけど、ひょろっと長い1本に対してシェーバーは無力では? 刃は4枚も5枚もいらない。2枚か3枚で足りるし、枚数による違いがそもそもわからない。というわけでスーパーかアマゾンでテキトーに安い6+2本とか8+2本入りみたいなのを買っていたんだけど、この前買い足したものがどうにもよろしくない。初めて使うものではなく前回は特に違和感がなかったので、直前に使っていたものとの違いが使いにくさを感じさせているのだと思う。思い当たるのは2点。1つは刃がぐらぐらなこと。製造不良ではない。たいていの T 字は押せば刃が可動するようになっている。しかし考えてみて欲しい。押せば刃が逃げる状態で、どうして適切な角度、適切な力で刃をヒゲに当てることができるのか。2つ目は同じ2枚刃なのに今のはヘッドが倍くらい大きいこと。刃の上と刃の下の余白が大きすぎる。だだっ広い平面を剃るのではない。あごの曲面をそるのだし、鼻の下を剃るときは鼻が邪魔になる。その余白に意味がありますか。そういうわけなので、これまでのようにテキトーに安い T 字ではなく、ついこの前まで使っていたとりわけ安い T 字であるシック・エグザクタ2を指名買いすることに決めたのでした。以上のことは、自分はヒゲが薄くて何の苦労もしていない、という話なのだと思う。


2024年10月10日 (木) [AtCoder] 精進。先週末あった ABC374-E Sensor Optimization Dilemma 2。「解けるんだからネタバレは嫌だ」とは書いたものの手詰まりだったので、Ruby の AC スクリプトをダウンロードしてきて見つけたダメケースを参考にデバッグをした。■TLE×4TLE×1 のち AC (334 Byte / 1285 ms)。A*B ないし LCM(A,B) の単位では最適な比率が確定するだろうというのが自分の解法の根幹にあったのだけど、そうではなかった。解が W だとして W の周辺 A*B ないし LCM(A,B) の範囲に最適な比率があるというのが正解だった。たぶんね(←それだからお前は……)。TLE×4 の原因は LCM(A,B) ではなくより大きな A*B を使っていたこと。TLE×1 の原因は心当たりが2つあって、1つは二分探索の上限が X によらず一定だったこと。X に依存するようにして最大の場合でも 10 進1桁だけ上限が小さくなるようにした(けど二分探索の回数が3回減るくらいしか期待できなくない?)。2つ目が二分探索の判定を早期に打ち切るようにしたこと。全部を足してから判定するのではなく、累積値がボーダーを超えたらすぐにリターンする。こんなしょうもない定数倍の改善が AC するために求められるのはつらいなあと思ったら、Ruby で提出している他の皆さんは 79 から 931 ms の範囲で AC を出していて、中央値も平均も 120 から 130 ms のあたりにあるみたいだった。自分が桁違いに遅いだけだった。


2024年10月07日 (月) [AtCoder] 精進。おとといあった ABC374-F Shipping。ABC374 を通しての特徴だったけど、制約が 100 以下と小さい。O(N^4) とかにならない限り制約に殺される心配がなかったけど、制約からのメタ読みでアルゴリズムを絞らせない狙いでもあったのだろうか。そしてこの問題は代わりにパラメータが多い。溜まっている注文の数、どの注文まで出荷したか、最終出荷日、不満度の累計。それと最初は気付いていなかったんだけど、最終出荷日というのは Ti の値とは独立して決まるんだよね。何かの注文が出荷可能になったタイミングで必ずしも出荷されるのではない。注文が K+1 個溜まらないように出荷されるのではない。問題を読んで、読むだけでなく理解してください。■提出 #58547000 (AC / 461 Byte / 106 ms)。コメントに書いたように、i 番目の注文を含む 1 から K 個の荷を出荷するような DP を書いた。中心となるデータは最終出荷日と累積不満度のペアの配列。出荷日が遅れるほど不満度は低くなければいけない。逆に言えば、出荷日が早いなら不満度が高くても記録する価値がある。日をおいて改めて考えてお風呂デバッグが完了したと思ったら逆に WA が増えた E 問題と比べると、落ち着いて整理すれば解ける普通の問題だった。■E 問題が解けるまで ABC374 のふりかえりはできないよ。提出一覧で他の人の提出を見たり、順位表で解いている人数を見たり、AtCoder Problems で難易度を見たり、Yahoo!リアルタイム検索で X の投稿を読んだり、ブログの参加記を読んだりできないよ。解けるんだからネタバレは嫌だ。E 問題を始末するまで ABC374 が終わらない。■■■E の精進 (20241010)。


2024年09月30日 (月) [AtCoder] 精進。おとといあった ABC373-F Knapsack with Diminishing Values。X で調和級数とのキーワードを見かけていた。ならば恐れずにやるだけかと思って愚直気味に書いたものは、N のループの中で W のループの中で飛び飛びに W をループするものであって、最大ケース (N=3000、W=3000、wi=1 (i=1..N)) がコードテストで 10 秒以上かかるものだった。飛び飛びに W をループするって書いたけど、重さが1のとき実は飛んでいなかった。調和級数と聞いて勝手に飛んでいる気になっていた。調和級数ってどういう式だっけ? ループひとつの上限? 二重ループの上限?■提出 #58293215 (AC / 510 Byte / 2001 ms)。重さの種類数と品物数が同数ということで、重さにはかなりの程度重複があると想定できる。重複なしにしようとすると重さは1から W の範囲に散らばることになって、重さが W に近づくほど同じ品物を1個までしか選べなくなるという点で好都合になる。だから重複はかなりの程度あると想定する。同じ重さの品物をまとめて扱いましょう。1個選ぶときの最大価値、2個選ぶとき(同じ商品を2個でも別の商品を1個ずつでも)の最大価値……を予め求めておく(6行目から 18 行目)。そうするとループの構造は変わらないけど、最外ループの回数が N から w の種類数に減って AC だった。想定解法かどうかはわからぬ。■Ruby ですでにある AC は l0rzl さんの提出 #58243889 (AC / 1429 ms) のみ。短いし 25 % 速いし、Rational を使ってソートしてるし、これはなんなんだろう。定数倍のハンデがあるにもかかわらず Array でなく Hash を使っていて速いというのは、重さの重複によってキーが限定される効果が大きいんだろうか(だけど w=1 を処理した時点で 0 から W まで全部埋まるよなあ)。優先順位を付けるのは、価値の低い品物が価値の高い品物が一度通った道を再度通らないように、とか? 3重ループの構造は同じ。だけどそれぞれにループの回数を減らす工夫があって違う。■自分のは、どうせ 900 万だからと前処理を愚直にやっているので、そこをサボらずにやる手はある。だけどそうすると元から比較して長かったのがさらに長大化するのが必至。うまくないなあ。しかもプライオリティキューを使っても変わらんかった>提出 #58342271 (AC / 2012 ms)。たしかにメインループの外だから影響は小さいだろうけど、ゼロだとは思わなかった。