/ 最近 .rdf 追記 設定 本棚

脳log[2023-09-09~]



2023年09月09日 (土) [AtCoder] 今日は ABC319 があった。コンテスト成績証自分のすべての提出。ABCE の4完だけど水パフォで軽傷だからへーきへーき。以下 E までの精進とふりかえり。■A 問題「Legendary Players」。えっと、冠の説明いりませんよね。知らなかったので役に立つ情報ではあったけど、余計な時間を使ったぜ。前にも書いたけど(20230729)、これはコピペ活用術が問われている。ヒアドキュメントで埋め込んで行単位でスプリットしてできた2要素配列の配列を to_h した(後知恵だけど、フラットな偶数要素の配列を Hash.[] メソッドの引数リストに展開して呼び出してもよかった)。残念なのは丁寧に整形した人よりも提出が遅かったところ。■B 問題「Measure」。読んでも理解できないので書いてある通りに実装した。ささやかな工夫は N の約数 j をループの外側で列挙したこと。■C 問題「False Hope」。正解者数が D 問題より少ないみたい。制約付きの順列数え上げなんだけど、全列挙して許されるサイズなので考える前に全列挙した。制約は多くても8個で、ある列にある数字が重複ありで AAB の2種3個のとき、A→A→B という風に同じ数2つを最初に出してリーチを演出すると高橋くんをがっかりさせてしまう。そういうケースを除外した。■D 問題「Minimum Width」。解けなかった。二分探索なのはわかる。その中で累積和を二分探索したのが良くなかった。累積和を前から順番に調べることで log を落とすことができる。これは Pairs の教訓(20230725)。しかし生かされなかった。そして実は累積和いらなかった。余計なことして無駄な時間を使って TLE を出したのみならず AC を逃した。つらい。■E 問題「Bus Stops」。Ruby で時間内に通せたのは1人だけ。それは自分ではない。クエリに対して線形時間ないしは対数時間で答えが出せないといけないがどうするか。X+Y+T.sum は必ずかかる固定の時間。停留所で生じる待機時間をどうやってすばやく数えるか。太字でこれみよがしに書かれている「ここで、1≤Pi​≤8 が制約として保証されます」がどう活用できるのか。最初は8×8の 64 通りに qi+X を分類して答えを求めておけばいいかと思った。でも足りなかった。1から8までの LCM である 840 通りであれば足りた。だけど 840×N≦8400万は Ruby にはつらい数字。D 問題に続いて E 問題まで答えは出せても TLE というのは残念すぎるので、先日の精進(20230831)にならって C++ で提出したら 624 ms で AC だった。制限時間は3秒。Ruby でも2秒を切れるみたいだけど、どんな考察が求められているのかまだわからない。■F 問題「Fighter Takahashi」。薬を飲む順番を総当たりして許される制約。敵はポーションのまわりに集約できる。ポーションは直列と並列に並べられる。あとは効率良く総当たりしたいけど、うまく書けなかった。DFS でやるんかな。■■■F 問題。すでに飲んだ薬の集合をキーとして、倒せる敵をすべて倒したときの強さの最大値を記録したものを状態とする。次に飲む薬を選び、倒せる敵をすべて倒し、記録する。これでいけると思う。DFS だと飲んだ薬の集合ではなく薬を飲んだ順番を区別してしまうので、計算量が危険? 10 の階乗はだいたい 370 万やからいけるやろって思ってたんだけど、案外遷移に時間がかかる? つまり、倒せる敵を倒しつくすのに(※薬の倍率が1以上なので薬を飲む前に倒せる敵を倒さない選択肢はありません)。プライオリティキューを使って、敵の数×log(敵の数)<5000。あっ、これはいけない。状態数を 1<<(薬の数) (1024 以下) に抑えてやっとなのだな。■ところで、Ruby ですでに AC になっている提出 #45433698 を答え合わせに使ってデバッグをしていたのだけど、こういう No ケース (4つの頂点が1列に並んでいて、1の直接の子が強さ9の敵) に Yes が返ってきて困ってしまった。答えが2択だとこういうこともあるかな。こちらは大丈夫みたい>#45434962 (require があって実行がやや面倒)。■提出 #45461169 (AC / 1755 Byte / 94 ms)。通った! こんなに不安だった提出はそうそうない。Octopus (20230902) とか? 提出をためらっているあいだに変数にコメントをつけたりなんかして。しかも2桁 ms なのが嬉しい。1.7 KB も文字を打った甲斐がある。ちなみにプライオリティキューは使ってないよ。敵は木構造を持って整列しているので線形時間のマージ操作を書いた。敵を倒すときも線形時間で走査する。これは5問目の橙 diff AC。ABC の高難度評価は当てにならないらしいけど、相対的に十分難しいのはたしか。


2023年09月04日 (月) 【悲報】妻「7万円の脱毛器買った」夫「どんな仕組みなの?」妻「ギャオオオオン!!」 → 叩きつけてフローリングと脱毛器を破壊 : 暇人\(^o^)/速報 - ライブドアブログ」「この怪談、38年生きてきた中で一番怖い。 - Togetter」■おもしろかった。ちゃんと的確なリプライがついてるし、そういう読み方をさせられるもともとの「怪談」がよく書けている。何がハラスメントかって、夫は購入に「OK を出す」立場で、7万円を「返せ」と請求できる立場で、「社会で頑張って稼ぐ男性」という立場であるということに疑いを持っていないあたり。最後にいたって全女性に喧嘩を売ってるんだからわかりやすすぎる。そういう人間がどういう仕組みで効果があるのか質問することの意味。それは実質的に審査(の続き)であるし、夫が疑っておらずしたがって妻が受け入れているらしい上下関係からくる圧で説明を回避することもままならなかったのでは。いやべつにおもしろい話ではなかったな。こうして書いていてフラストレーションがたまってきた。この「怪談」にはカタルシスが欠けている。釣り針だけで釣り宣言がない。


2023年09月02日 (土) [AtCoder] 今日は THIRD プログラミングコンテスト 2023 アルゴ(AtCoder Beginner Contest 318)があった。トップページの煌めく Kaggle Grandmaster の文字がおしゃれですね。CSS Animation で2秒のうち一瞬だけ可視不可視を切り替えてるっぽい? そういうの初めて見た。あ、任意色も任意の色をまとってアピールしてる! コンテスト成績証自分のすべての提出。ABCDE の5完は前回と同じ。同じなんだけど、前回は早解き失敗でまさかの緑パフォだったのに、今回は早解き成功で青パフォ。何この天国と地獄。あと1問解ければ解決だね(できるならね)。以下 ABCDE のふりかえりと F の精進について。■A 問題「Full Moon」。制約を見てだめな気がしたから計算で解いたけど、全探索することもできた。でもミスが怖いという点では大差ないかも。A 問題の提出にドキドキはいらないんで、もうすこし容赦してほしい。■B 問題「Overlapping sheets」。Tangency of Cuboids を覚えていますか? 私は覚えています。でもあちらは E 問題 (黄 diff) でこちらは B 問題。もうすこし容赦してください。でも今日のは灰 diff だなあ。3次元と2次元という以上の落差が謎。■C 問題「Blue Spring」。ふりかえり中に気がついたけど、アオハル=18切符ってことね。ソートして高額区間を優先して貪欲にシミュレートした。■D 問題「General Weighted Max Matching」。つい最近 ABC313-B「Who is Saikyo?」と ABC317-C「Remembering the Days」で制約が小さいからと雑に DFS を書いて TLE を出したことを覚えています。雑に書いた DFS の計算量には階乗がでてくるみたい? AC 解答も順列の全探索だったから階乗でいけないことはないと思うんだけど、Ruby では書き方によりダメということか。今日はきっちりメモ化再帰を書きました。D 問題ならそれくらいはね。■E 問題「Sandwiches」。同じ数ごとに添字を集めて昇順または降順で添字の和と添字の個数をメモしながら数えた。添字の和と個数がわかれば作れるサンドイッチの数がわかるし、添字の個数がわかれば除外すべきサンドイッチの数がわかる。■時間内に解けたのはここまで。それぞれの問題に費やした時間が A=3分、B=4分、C=7分半、D=6分半、E=10分。■F 問題「Octopus」。解答の方針は立ったけど1時間以上あっても解けなかった。このややこしい問題が時間内に解ける未来が見えない。方針はこう。X 座標の左端からスタートして右に向かって移動するタイムラインを再生する。時刻の幅が広いので局面が変化するタイミングで刻んでお宝をつかんでいる時間を数える。局面の変化っていうのは距離で並べたお宝が入れ替わること。つまりお宝の順番を固定して考えられるように時間を刻んだということ。お宝の並びが決まれば対応する腕の長さが決まり、お宝をつかんでいられるたったひとつの区間が求まる。それら N 個の区間と現在の時間の区切りの共通部分を答えに計上する。サンプルの2が親切だけど、タイムラインのスタート地点はよく考えよう。X.zip(L).map{|x,l| x-l }.min が十分。Ruby だから関係ないんだけど、制約が 61 ビット使うといっているので 10 倍 100 倍してテキトーに小さい数を初期値にすることをためらってしまった。それが WA の理由のひとつ。もうひとつが等距離にあるが右にあって近づいてくるお宝と左にあって遠ざかっていくお宝の扱い。近づいてくる方を短い触手に割り当てる方がお宝がつかめる可能性を高める。いやいやいやそんなんわかりませんて。ランダム入力を何十回試してもそれによる不一致は出てこないんだよ。まあ、無限ループなのでいずれ見つかるんだけど。■今日の日記にここまででタコの腕とタコの触手が出現しているけど、問題文ではタコの足になっている。実際のところタコのあれはなんなんだろう。「タコの足の本数は何本?タコの足の数はなぜ8本なの?腕が再生して96本! | BIJOH [ビジョー]」を読むと腕と足は間違いではないが触手には言及がない。触手について「無脊椎動物の体の前端や口の周辺にある糸状またはひも状の突起。先端に多くの感覚細胞が分布し、触覚や捕食の働きをする」と明鏡国語辞典に書いてあるのを読めば当てはまるような気がするが、違うと言われれば糸でもひもでもないからかなあとも思う。でもそんくらいしか違わないよね。ナチュラルに触手ってワードが出てくると、すわエロアニメによる刷り込みかという警戒心が働くのだけど、別に不自然な言葉選びではなかったのではないか。でもそれをここにこうして書くのはダメだと思う。


2023年09月01日 (金) [AtCoder] 精進。ABC131-F「Must Be Rectangular!」(青 diff)。最初のステップは誤読への気付き。どういうわけか角が1つ欠けた四角形があるときに「3点を消して」欠けた一角に点を打つのが操作だと勘違いしていた。そうするとグラフ構造が生じる。ある1点がどの4つの四角形に属すると考えて操作するかによってその後の操作回数が変わってくる。今日また問題を読んでみたら点を消すとかどこにも書いてなかった。次の1手は X 座標でも Y 座標でもいいからソートして順番に処理してみること。処理に方向性を与えることで考えるべき次元が下げられる。たとえば X 座標でソートして昇順に処理すると決めると、現在の Y 座標グループ(同じ X 座標を持っている)とすでに処理した Y 座標グループの関係を考えるだけで良くなる。そのようにお膳立てして考えてみて気が付いたことは、2つの Y 座標グループのあいだで操作を行うために必要なことは、2つのグループが同じ Y 座標に点を持つことだとわかった。それだけなんだ。2つの X 座標(x0,x1)と1つの Y 座標(y0)があって2つの XY 座標((x0,y0),(x1,y0))に点があるとき、(x0,y) に点があるなら (x1,y) に点が打てるし、(x1,y) に点があるなら (x0,y) に点が打てる。そうしてすべての操作が完了したとき2つの Y 座標グループは全く同じになる。2つのグループをマージしたのと同じ状態になる。ここまでわかればあとは UnionFind が火を吹いて終わり。■提出 #45108485 (AC / 668 Byte / 341 ms)。点を Y 座標で括って X 座標をグループ化する。点を X 座標で括って X 座標が属するグループに点を打っていく。あるべき点の数から実際にある点の数(全部で N 個)を引いて答え。■UnionFind を使うにしても二部グラフが見えてる人と見えてない人(私です)がいるみたい。UnionFind を使わない提出 #6097246 もあった。


2023年08月31日 (木) [AtCoder] 精進。ABC191-F「GCD or MIN」(黄 diff)。最初のとっかかりとしてまず gcd を無視して min を考えた。min だけのとき最後に残るのは A 数列の中の最小値。ここに gcd がどう関わってくるか。gcd(a,b) は必ず min(a,b) 以下の数になる。そして最小値は最後まで残すことができる。まとめると……。A 数列の最小値を M とする。M は最後まで残すことができる数のひとつであり、その中では最大のもの。gcd(A[a], A[b], A[c],...) によって作ることができる M 以下の数はすべて最後まで残すことができる。その種類数が答え。■提出 #45084618 (AC / 725 Byte / 1974 ms / 5332 KB)。DP をした。それも頭の良くない DP を。まず A[0] を配列の先頭に配置し、以降 A[1] から A[N-1] について、配列の全要素とのあいだで gcd を計算してそれら gcd と A[i] そのものを配列に追加した。重複がないとすると伸びていく配列のサイズは 0,1,3,7,15,...,2^N-1 という感じで成長していって、N≦2000 だから2の 2000 乗はやばいんだけど、実際は gcd が1になったり重複したりすることが多いのでそれなりに大丈夫。でも Ruby では4から5秒かかって大丈夫ではなかったので C++ の犯罪力に頼りました。実は C++ であっても2秒を数百 ms オーバーしてしまったので、GCC ではなく Clang を選んだり、set ではなく unordered_set を使ったり、2つ使っていた unordered_set を1つに減らしたり、初期にあまり配列を伸ばさないで済むように A 数列をシャッフルしてみたりした(※逆にソートすると悪化した)。それでも2秒を 50 ms ほどオーバーしてしまったのだけど、unordered_set に大きめの初期サイズを与えると 100 ms 弱縮んでようやく AC の目途が立った。Ruby で通してる人は素因数分解をしたりしてるんだろうか。Ruby でも3桁 ms で AC がとれるらしいんだよね。自分にはわからんけども。■ブログを2つほど読んだ。約数を列挙してそれが GCD になりうるかどうかを調べるといいらしい? さっき書いた素因数分解~云々がそうなんだけど、素因数の指数部分を減らしてみて、共通部分を持つ他の要素を(1つ以上)見つけて、非共通部分の GCD が1になるかどうかで答えの候補になるかどうかがわかる。でも計算量的にそうした方がいいという判断ができなかった。■Ruby で約数を列挙してさっき書いたようにして答えを出してみたら、many_divisors_00.txt というケースが最長で、2秒を 121 ms オーバーした。ましにはなったけどまだ考えが足りないらしい。提出 #45095866 (AC / 628 Byte / 192 ms / 9844 KB)。Ruby では TLE 間違いなしなのでこれも C++ だけど、1974 ms → 192 ms で 10 倍ましにはなってるんだな。このうえさらに Ruby で通すのつらすぎるぜ。■提出 #45096878 (AC / 259 Byte / 1762 ms)。これは Ruby。AC と TLE の分かれ目はまさかの約数列挙ループだった。while b*b<=a; if a%b==0; c = a/b end b+=1 end なら AC で、while b<=c; if a==b*c; end c = a/b+=1 end なら TLE。AC の方では足し算1、掛け算1、剰余演算1が毎回で、約数が見つかったときだけ割り算が1。TLE の方は足し算1、掛け算1、割り算1を毎回やっている。剰余と割り算のコストが同程度なら剰余を求めないで済んでる分得かなと思うんだけど、そういう結果ではない。違うんだ? ループ回数は同じだと思うし、どこで差がついてるのか本当にわからない。■3桁 ms の2つの提出(#20120433, #20414187)を読んだ。約数列挙に工夫があった。最初に素数を列挙している。たしかに1ずつ加算して割り切れるか確かめるより、素数について指数を調べる方が効率が良さそう。


2023年08月30日 (水) 株式会社キョウプロ」 毎週末コンテストを開いているとかいないとか。


2023年08月29日 (火) 犬と散歩するときはルールを守りましょう→この写真がなぜか一万いいねされる「通知欄がスーパー肛門フェスティバルの会場と化してしまったので通知を切ります」 - Togetter」■マナーがルールによって上書き訂正されている看板。いろいろな受け止めができると思う。それはつまり効果的な看板ではないということ。まず文言。マナーがルールになったことで「ルールを守るのは当たり前のことやん、当たり前のことにわざわざ『犬と散歩をするときは』と条件を付けるということは、それ以外ではルールを守らんでいいということか」と勘ぐる余地を生み出してしまっている。ルールではなくマナーだったらぎりぎり不自然ではないかなと思う。■次が本題。この看板が何を訴えているのか、それがわからなくなった。マナーであれば、犬のうんこは持って帰ろうねとか、リードは必ず使いましょうってことかなと想像するけど、ルールとは何か。どこにどういう内容が定められているのか、自分は知らない。ルールを守ろうね、では当たり前すぎて何も伝えていないし、~が決まりですと書くのが効果的だと思う。ルールは知っていて当然(だからあえてここでは書かない)という態度は嫌いだな。もし決まりがないんだったらそれこそ意味不明な看板だけど、実際のところどうなんだろう。もともとマナーに訴えていたんだからなかったと思うんだけど。あるいは飼い主なら当然知っておくべき犬の散歩に適用されるグローバルなルールがありますか。


2023年08月25日 (金) [AtCoder] 「提出結果ページのソースコードが見られない」のつづき。Ace という名前の何かを提出結果ページと提出ページに採用したらしく、機能性を追加しつつ以前のようにコピーボタンや縦スクロールバーのオンオフや行番号表示が機能している。ま、提出ページでは貼り付け&送信しかすることはないけども。コピーボタンは AtCoder 謹製なのかな。必要にして十分ですよ。自分の提出をアップデートしたいときにちょいちょい使ってる。でも今回エディタ部分があまりにきっちりできあがってるので、Ctrl+(A、C) で全選択&コピーもできる。■カーソル行強調と対括弧強調がうるさいので消したのだけど、すごく頭の良さそうな(←語彙力)つくりになっていた。ソースコード領域は複数のレイヤーが重ねられていて、テキストレイヤー、マーカーレイヤー、カーソルレイヤーが主だったところ。マーカーレイヤーを非表示にしたらうるさい強調は全部消える。でも範囲選択も消えたので個別に消した。■インデントレベルを示す薄灰色の縦線が目障りだなと思ってこれも消そうとして気がついたんだけど、折りたたみ機能があるんね。でも Ruby の場合、縦線で結ばれていても折りたたみできないことがある。この提出(#38427641)の 17 行目の左シフト << をおそらくヒアドキュメントの開始と勘違いしているせいで、lb メソッドと BIT クラスが折りたたみできなくなっている。直前に数値(1)があることは認識できてるんだから、ビットシフトと解釈するのが自然だと思うんだけどな。数値と文字列をそのまま並べるような文法はないのだから。■インスタンス変数 @aace_variable ace_instance とクラス分けしているあたり、完璧ではないけど Ruby のことを知ってそうな雰囲気はある。■レイヤー分けの弱点がこういうところに現れたのだろうか。「AtCoder の新エディタに使われている Ace、多バイト文字の扱いがたまに怪しいので、 「※」などの全角記号を使うとカーソルの位置がズレる (※は「なでしこ」の行コメントの1つ、「プロデル」のプリプロセッサとして使われている) https://t.co/YwDlWqNNjf」。ひらがなとか漢字を使ったくらいでは問題ないので、あまり気にすることはないかな。それを確かめるためにさっきリンクした(日本語変数を使っている)提出をいろいろ調べていた。■もう昨日だけどこんなんがあったらしい。「新エディタテストコンテス」。A 問題難しくない? 前回の ABC-G に似た雰囲気を感じる。


2023年08月24日 (木) [AtCoder] 精進。ABC158-F「Removing Robots」(黄 diff)。この問題が黄色になってるのは、前に置かれていた E 問題の diff がやや下の青色だからという理由が大きいと思う。普通に一直線の DP だった。■提出 #44882536 (AC / 216 Byte / 408 ms)。ロボットを X でソートして順番に場合の数(起動した場合1 + 起動しなかった場合1 = 2)を記録する。そのとき、移動範囲内にあるロボットの場合の数を、起動した場合の数に併合しておく(掛け算)。最後に残るのは連結成分ごとの場合の数なので、掛けて答え。■えっと、併合するのは起動しなかった場合であって、常に1だけ加算して記録するのが起動した場合の数なのでは? どちらの初期値も1だから答えは合うけども、試行錯誤しているうちに理解がねじれていた。


2023年08月23日 (水) おしっこ(真面目な話)」■この話題は、なんでダメだ我慢しろという意見が主流になるのかわからない。出せばいいよ。別に汚くはないし、汚いというなら体の表面からはがれ落ちるものも同じくらいに汚いよ。お風呂はそういう場所でしょ。どちらかというと液体の方が面倒がないよ。もちろん他人がいないという前提での話。人前ではふるまいを考えよう。■増田は条件付けされると似た条件の他所でも漏らすからやばいと感じている。でもお風呂で感じる尿意は条件反射というよりは排尿反射の一部なのではないかと疑ってる。一度出始めたおしっこが途中で止められないように、水(お湯)による尿道への物理的刺激が尿意を誘発しているのではないかと。尿道炎になりかねない(と警告されそうな)のでおすすめしないけど、シャワーの水を注ぎ込んでみればトイレに行った直後でも尿意を引き出すことができる。■規則正しい生活をしていれば毎日寝る前の決まった時刻にトイレに行くことができる。そうしたら寝てるあいだには漏らさないよ。増田は自分で書いているように、自律神経がおかしくなっていたのが主因だったと思うな。■増田の趣旨からは外れるけど、お風呂→おしっこの条件が成立することは、お風呂入ろうかな→おしっこしたいな→先に出しておこうという行動につながるのでいい条件だと思う。■規則の話。自分は起きているあいだはほぼ3時間で1回分のおしっこがチャージされる。だから8時11時14時17時20時(寝る直前までちょっと我慢して)25時の1日6回が基本サイクル。どうでもいい話でしたね。


2023年08月22日 (火) [AtCoder] 精進1。ABC133-F「Colorful Tree」(黄 diff)。高速に木を処理する問題。2つの頂点のあいだで、距離と、指定した色の辺の数と、指定した色の辺の長さの和が知りたい。距離は根からの距離を調べておけば LCA を引き算して求まる。色の辺についても同じことができるけど、色の種類数が最大で N-1 あることが問題になる。予めすべての色について調べて記録しておくことは N^2 になるのでできない。どうするか。クエリ先読みでやった。■提出 #44828105 (AC / 1276 Byte / 1269 ms)。木でクエリ先読みというと ABC202-F「Count Descendants」を思い出す。コンテスト中に解けたのは会心の出来だったから。■■■精進2。ABC143-F「Distinct Numbers」(黄 diff)。K 枚のグループがいくつ作れるかを二分探索した。グループ数を G とする。G 枚より多いカードは G 枚だけ使える。それ以下の枚数のカードは全部使える。使える枚数が K×G より少ないかどうかで判定する。■提出 #44829467 (AC / 247 Byte / 932 ms)。あーっ、今なら ABC の D 問題に Project Planning (青 diff) が出てきても解けるなあ。同じ問題だこれ。■提出 #44843265 (AC / 190 Byte / 336 ms)。まったく同じではない点は、この問題の K は 1 から N まで可変だということで、サンプルを見てわかるように K が増えるにつれ答えである G は減少するという性質があるわけで、個々の K について独立に二分探索で答えを求めることには無駄があった。


2023年08月21日 (月) プラグが折れてコンセント内に残った! 怖過ぎる1枚が話題に、こんなときどうすればよいのか東京電力に聞いた(1/2 ページ) - ねとらぼ」■小学校の低学年くらいの頃、ふとした衝動から自転車の鍵をつっこんだことがある。手に鍵があり、目の前に穴があったのだ。ヴヴヴヴと震えるような感触があってあわてて引っこ抜いたのでした。感電とは違うのではないかな。しらんけど。


2023年08月19日 (土) [AtCoder] 今日はキーエンスプログラミングコンテスト2023夏(AtCoder Beginner Contest 315)があった。コンテスト成績表自分のすべての提出。以下 ABCDE のふりかえりと F の精進について。■A 問題「tcdr」。String#tr にはあまり自明ではないふるまいがあって、展開後の第2引数が第1引数より短い場合、第2引数の最後の文字が足りない分だけ補われる。最後の文字が存在しない場合(第2引数が空文字列の場合)は第1引数を削除する処理になる。他の人の提出で今日初めて知ったのだけど、String#delete という、まさに tr の第2引数が空だった場合に相当する処理を行うメソッドが存在していた。それも Ruby-1.8 のときにはもう存在していた。知らなんだ。■B 問題「The Middle Day」。制約が小さいので愚直にやる。だけどあまりに無駄な愚直をやってしまった。"月 日" という文字列の配列を全部生成してから真ん中を選んだんだけど、そこはさ、単に通年での day-of-year を数えておいて、文字列を生成するかわりに適切なタイミングで答えを出力すれば良かったじゃない。■C 問題「Flavors」。フレイバーごとにおいしさを記録してから異種組み合わせと同種組み合わせを考えた。ツイッターを見てると最大のおいしさが必ず採用されることに着目した解法が目立つ。そのアイスを2回食べてしまうミスにだけ注意すれば配列1本で処理できるのが魅力的な解法だと思う。ミスへの対処法は、必ず選ぶ1つを配列の先頭もしくは末尾の要素とスワップして、先頭もしくは末尾を探索範囲から外すのがいいかな。■D 問題「Magical Cookies」。最終的に E 問題の3分の1くらいしか正解者がいないいわくありげな問題。下手をするとすぐ TLE になるみたい? 自分も 35 分と、E 問題より時間をかけて慎重にやっている。TLE 以外に小さな罠もあるにはあって、問題文に書いてある通りの手順を守らないと最後に残るクッキーが違ってくるような気がする。行を取り除くには2列以上、列を取り除くには2行以上残っていないといけないという条件から、残り2行もしくは残り2列付近で手順が最終結果を左右するのではないかと思う。手順を守るように途中で書き直したおかげかは知らないけど、というか書き直しだけなら5回も6回もそれ以上でも行きつ戻りつしていたのだけど、ペナルティを出さずに AC だった。TLE を回避する手段は、まだ残っている行番号と列番号を記録して使用することと、行と列にある文字の種類と数を記録して使用すること。■E 問題「Prerequisites」。スタックに積んで順番に読むだけ。WA を出したのはひとえにあほだからです。もう読んだフラグを立てるタイミングを間違えた。そのタイミングで何かするのを帰りがけ順っていうらしい(聞いたことはあるよ)。■F 問題「Shortcuts」。とりあえず DP で解けるのはわかる。制約が1万以下とよくあるものより1桁少ない。2乗で1億、定数倍2分の1で 5000 万。言語アップデートにより「倍早い」こともある Ruby-3.2 ならワンチャンあるかという数字。時間内に提出したものは TLE だった。ああ無情。■F 問題。悪いのはもちろん Ruby ではない。実は途中で必要に迫られて DP 配列の次元を増やしていた。O(N^3) にはどんなチャンスもない。ツイッターで見ちゃったんですよ、ペナルティは 50 回まで考えれば十分だと。見積もってみれば 28 ビットで上限を突破しそうだったので 30 を上限にしてみたら通った。O(30*30*N) だから 900 万のレベル。大枠は完成していたんだから時間内に通したかったねえ。