/ 最近 .rdf 追記 設定 本棚

脳log[2023-05-02~]



2023年05月02日 (火) [AtCoder] 精進。ARC100-D「Equal Cut」(青 diff)。最大値とか最小値とか見えるので二分探索で解きたい気持ちになる。何をボーダーにして判定するか。最初に考えたのは4つの部分列 B,C,D,E の和 P,Q,R,S が最低いくつ以上でなければならないか。そうすれば部分列の和は途中までは基準を少し超えたところで揃う。これの何が良くないか。たとえば前の方の部分列が基準を多少大きく超えた方が全体としては凸凹が均されるかもしれない。それは A 数列の配列による。他には部分列の和の差(つまり答え)が超えてはいけないラインを決め打って探索ができるか考えたり。でもまとまらなかった。■提出 #41124597 (AC / 339 Byte / 812 ms)。まず数列を2つに割った。これは総当たりで。次にそれぞれをできるだけ均等に割った。これは二分探索で。仮に2つに割った前半/後半が2等分できるときに、あえて差をつけた方が答えが良くなるケースがあるかをよく検討した。なかった。


2023年04月29日 (土) [AtCoder] 今日はユニークビジョンプログラミングコンテスト2023 春 (ABC300)があった。自分のすべての提出コンテスト成績証。ABCDE の5完水パフォ。C 問題からふりかえり。■C 問題「Cross」。ばってんの大きさを計って集計する。問題文がちょっと難しかった。✖印の判定条件の3つ目が「X 字の先端4点の延長にある4点のうち少なくとも1つは . である」という内容だった。理由はわかる。さもなければそれはより大きいばってんとして数えられるべきだからだ。でも本文中に「バツ印を構成するマス以外に # は書かれていません」「異なるバツ印を構成するマス同士は頂点を共有しません」という条件が書かれている。そうすると結局判定条件としては「少なくとも1つは .」だけど、実際に入力されるものは「4つとも . になっている」ということだ。別にそれで問題はない。ないんだけど、全体として過不足なく丁度になっていないことで考え漏らしがあるかと疑念が生じて考えてしまった。あとは「頂点」ってなんだ?とか。具体例を読めばグリッドの十字部分らしいとはわかるけど、推測ですよ。解答は X 字の右上がりでも右下がりでもいいので端点を見つけて長さを計る。ちなみに最初に考えた解法は UnionFind を使うもので、問題文を読むときも UnionFind が使えるかどうかを確かめながら読んでいた。でも判定が簡単そうだったので UnionFind は書かないで済ませた。■D 問題「AABCC」。来たよ、苦手な苦手な D 問題、数学(素数)、緑 diff(予想)。数字と友達になれないと TLE になるやつ。解けなかった ABC296-D「M<=ab」の反省から N の平方根の範囲で何かする制約だとはすぐに読み取った(この前はそれすらできなかった)。あとはやや長めの3秒制限を信じて打ち切りながら全列挙した。自分の提出は Ruby の中でも一番遅い部類。苦手なんだよ。■E 問題「Dice Product 3」。確率の問題。Ruby による他の提出を見ると一番早い提出がたぶんメモ化再帰で自分のと全然違っていた。自分の解法。まず、N が2と3と5の積に分解できなければいけないので因数を数える。4と6の目はひとまず無視して2と3を数える。1の目は最初からないものとして5面ダイスで問題を解く。その場足踏みはサイコロを振らなかったのと同じことなので。N が2と3と5に分解できたら6の目と4の目の数を決め打つ総当たりで、ダイスの目の並べ方を組み合わせで求めて確率を出す。解答の C 関数の定義がやや不自然だった。引数を n と rs から rs だけにして n は rs.sum で求めることにすると無駄がなかった。■F 問題「More Holidays」。解けなかったのでこれは精進。方針は、1つの x で区切られた長さ 0 以上の o の連続を、K 回連結することを考える。K はべらぼうに大きな数になりうるけど、仮に入力 S に含まれる x の個数が X 個だとしたら K/X と K%X を使ってうまく数える。罠がいくつかある。どの o の連続から数え始めるかを全探索するのだけど、後ろの方から数え始めて K 回連結したときにうっかり T の長さ NM を超えてしまわないこと。まだある。入力の先頭と末尾が o の文字で、操作回数 K が x の個数の倍数で、繰り返し回数 M が十分に大きいとき、末尾と先頭にある o の連続を一体で扱わなければいけない。


2023年04月25日 (火) クリアしたゲームに出てきた「古の民」というワードについて。これが自称として使われるんだけど、そういうことってあるのかなと考えてしまった。つまり、古い民というのはレトロニムなのであって、古い民しかいないときに古い民を自称したりはしないだろうと思った。新参、古参という言葉への色の付き方を考えれば、自ら古さを誇ることが全くないこともないかもしれないけど、可能性としては、古い民が自らを指し示す固有の文字があるとして(その時点で古い民と同じくらい古い民が昔はいたっぽい)、その文字に古い民という意味を割り当てた、古い民と対置される読み手が存在するのかなと。古い民というのは読み手の語彙なのであって、ゲーム内ドキュメントは読み手の目を通してプレイヤーに提示されているのかなと、考えたのでした。その読み手っていうのは実はゲーム開発者なんでしょとも意地悪く思ってはいる。■先住民族とか極東とか。交流があれば外からの見かたを取り込むこともあるのかな。「我ら先住民族」と名乗る人がいるかは知らないけど、自らを地図の右端(far east)に位置づける日本企業は知っている。


2023年04月21日 (金) 登記所備付地図データ公開の時に知ったんだけど、デジタル庁のアドレス・ベース・レジストリが自分のほしいものだなと。実際のデータを見るとわりと何番何号の座標が得られるんだけど、新しい区画のデータがなかったり、○○市△△がすっぽり抜け落ちていたり、かゆいところに手が届かない感じ。一次データを持っているところが素早く網羅的に使えるデータを公開すると、マピオンなどの使い勝手が上がることで恩恵があると思う。待ってるよ。■データ解説書(PDF/2,279KB)を読むと「地番のマスターデータは、未整備で、整備・公開のあり方について検討中です。」「2022年度の整備予定は以下とおりです。(略) 地番マスターデータの整備を実施します。ただし、一般への公開可否は未定です。」と書いてある。すっぽり抜けているのは地番形式の住所っぽい。地番っていうのは何丁目何番何号という形になっていない古い形式の住所(と PDF に書いてある)。登記所備付地図データをみると地番というフィールドがあって、抜けていた地名もあるから、補完できるみたい。デジタル庁の「登記所備付地図データ(地図XML形式)変換コンバータの公開について」というページをあらためて読むと「法務省がG空間情報センターを介して提供したデータを活用し、地番データや筆の形状データを取得・反映していく予定です。」「地図XMLのデータから、筆のポリゴンデータおよびアドレス・ベース・レジストリの整備に必要な属性のみ抽出・出力します。基準点、筆界点、筆界線は出力しません。」と露骨に書いてあったね。備付地図データの方では(何丁目)何番何号もハイフンで繋いで地番扱いみたいだから「地番」といっても同じものではないみたい。■フォーマットされた地番データと新区画のデータを待ってるよ。


2023年04月20日 (木) 新聞の将棋欄で「俗ながら妙手」という表現を見た。妙手なのに俗だと、なんとなく下に見るような雰囲気が感じられるのはどういう手なのか、気になりました。よくわからない価値観。指しやすい手がそのままうまい手、くらいの意味かなと思っている。あえて但し書きを付ける心理はやっぱりわからないが。


2023年04月19日 (水) 『スーパーユーザーなら知っておくべき Linux システムの仕組み』を読み始めた。良いか悪いかは別として、「スーパーユーザーなら」という煽りからは予想できないほどに、当たり前すぎる(と感じる)基本のキから丁寧に書かれている。もう少し薄くても良かったかな。1冊で間に合うと考えれば利点ではある。■印刷について。思わず他の本と見比べてしまったのだけど、意識しないでも気が付いてしまうほど明らかに質が低い。解像度が低く文字の輪郭がなめらかではない。黒色ではない。(解像度の低さと同じことかもしれないけど)影を付けたように滲んでいる。家庭用プリンタで印刷したのかな、という品質。眼鏡を外すまでは気が付かなかったのではあるけども。


2023年04月18日 (火) [AtCoder] 精進2。ABC146-F「Sugoroku」(水 diff)。Sugoroku という名前の問題は、調べて予想の倍あって驚いたんだけど、まであって、前回の ABC でもちょっと変化球で Unfair Sugoroku という名前の問題があった。いずれも確率と期待値の問題。だから初代が最短(辞書順)最小の手順を答える問題だったのが意外。■1手につき1から M マスまで進める。最短であることが第一だから、まずは M マス進めるときは M マス進んでしまう。無理なら M-1 マス、M-2 マス……。いっぱい進みすぎてしまうことで誤って到達不可と判断してしまうおそれはない。それはつまり M マス連続してゲームオーバーマスがあるということであり、どう手順を刻んでも結果は変わらない。次に、同じ手数のなかでは辞書順最小の手順を答えにしなければいけない。このために最短手順を求めるときはゴールから貪欲に最大歩幅で移動を繰り返し、最小手順を求めるためにはスタートから逆向きの移動を繰り返した。結局、最初の1手を最小限に小さく刻んだ後は最大歩幅での移動を繰り返すことになるのだね。■提出 #40753539 (AC / 203 Byte / 113 ms)。すんなり AC できたわけではない。最初は DP のつもりで各マスに最小手数と最小手数の中での最小出目の2つを記録していった。答えは合うけど TLE。次は各手数において到達可能な範囲を表す2つの数を記録していった。M が大きい場合に DP 配列を1マスずつ埋める手間が節約できたけど、これも2ケースは TLE が避けられなかった。最終的に各手数において可能な移動先の先端だけを記録するようにした。■■■精進1。ABC141-E「Who Says a Pun?」(水 diff)。これまでも何回か読んだことがある問題だけど実装には至っていなかった。■提出 #40750806 (AC / 218 Byte / 1688 ms)。N 個の各添え字について、長さ1のプリフィックスが共通するもの、長さ2のプリフィックスが……、と順番にグループを細分化していった。その過程で同じグループの中で最小の添字と最大の添字の差がプリフィックスの長さより大きいことを確かめる。■Ruby によるすべての提出を見ると最速は 87 ms なので 1688 ms は2桁遅い。見ると、添字と長さを0から開始して、見つかれば長さを伸ばす、見つからなければ添字を増やして再検索する、という手順を繰り返すみたい。じっくり見ても混乱するややこしさ。


2023年04月15日 (土) トヨタ自動車プログラミングコンテスト2023#1(AtCoder Beginner Contest 298)があった。自分のすべての提出コンテスト成績証。C 問題に提出しようとして失敗したときにサーバーの異変に気が付いた。数分間リロードを繰り返しているうちに正常に戻ったのでそのまま続けた。C、D、E、F と AC を得て気楽な気分で G 問題を読んでいたのが終了 10 分前で、普段読まない質問ページを開いたのもこのとき。DDoS の影響で unrated だってさ! こんなに残念なことはない。俺が6完するのは珍しいんだぞ。今回は B 問題から重めの問題だったので振り返りも B から。■B 問題「Coloring Matrix」 問題文に書かれている回転の定義を読み解くのがまず難しい。2つの行列を照合する方法は2通りあって、Array#transpose と Array#reverse を組み合わせて行列自体を回転する方法と、添字を変換する方法。添字を変換する方法でやることにした。その方法だけど、90 度回転する変換と 180 度回転するものと 270 度回転するものをそれぞれ定義しようとして苦労して、(あまりに苦労したからどこかで間違えているに違いないと考えて)デバッグのために3行3列の変換結果を表示してみたけど、それが合っているかどうか読み解くのが自分には難しいということが明らかになった。問題文を読んで回転を脳内再構成することから難しいのだからそりゃそうだ。考えることをやめて「A_{i,j}​ を A_{N+1-j,i} で置き換える」という添字の変換をそのまま実装して2回3回と繰り返し適用することにした。AC まで 18 分。照合という語を使ったことについて補足。判定条件が論理パズルみたいでちょっと面白かったよね。A の要素が 1 のとき B の要素が 1 でなければいけない。ということは、A=0 のとき B は何でもいいし、逆に B=1 のとき A は何でもいい。A=1⇒B=1 (もしくは B=0⇒A=0) を確かめる式は A==0||B==1 になる。これって有名なパズルで、人間は未成年の飲酒を見つけるためならば確かめるべきを間違えないけど、ただの記号の組み合わせだとルール違反を見つけるのが途端に難しくなる。■C 問題「Cards Query Problem」 D 問題に出てもおかしくないような、下手を打つと TLE になりそうな制約と操作。あなたは std::set と std::multiset が使えますか、と問う問題かなと思うけど、Ruby にはない。カードごと箱ごとにソート済みの列と未ソートの列を1本ずつ持つことにした。答えを出力するタイミングで未ソートの列をソートしてマージする。出力する数の合計が 20 万以下に制約されているから、ソートする要素数も、マージ操作のコストも同じレベルに抑えられているはず。AC まで 28 分。方針を決めるまでにすこし考えたし、実装量もそこそこ多かった。実は実装に手間をかけなくても、1つの配列につっこんで出力の直前にソートするだけで十分だったっぽい。出力の総数が制約されているとはそういうことだよな。■D 問題「Writing a Numeral」 これは簡単。各桁の数字と全体の mod を記録していく。クエリ2で引き算をするために 10 の冪乗の余りも並行して記録していたけど、たぶん都度 pow メソッドを呼んでも大丈夫だった。■E 問題「Unfair Sugoroku」 確率の問題。確率とか期待値の問題って方針を決めるところに難しさがある。正解方針が引ければ答えが合うけど、答えにたどりつけない方針を引いてしまいがち。当てもんをやっている。「Boy or Girl paradox」とかモンティ・ホール問題とか、知らなければ避けられない、ヒトが傾向的に陥りやすい誤りがある。方針に迷って F 問題に手を付けるも一時退却してきたときにひらめいた正解方針がこう。高橋くんがサイコロを振って進んだ先のマスに場合の数を書き込みます。各回において高橋くんが初めてマス N に到達した場合の数と青木くんがマス N 以外のマスにいる場合の数から勝ちの確率を求めます。そうして各回で勝つ確率の総和が答え。制約が小さかったので愚直に配列をスキャンして数字を出したけど許された。助かる。■F 問題「Rook Score」 なんかやるだけに見えるけど、やや長めの制限時間3秒が気になる。たぶん想定される落とし穴は、0 以外の数字が書いてある N 個のマス (r,c) のどれかを答えの候補にして他を考えないことだと思う。しかし答えの候補は N 個の r と N 個の c の組み合わせから選ばなければいけない……ような気がする。しかし O(N^2) が許されない制約。どうする。貪欲にやって見込みがなくなったところで打ち切るようにしたら間に合った。それでいいのか?■「アライグマ「F問題は、行和+列和が大きい順にN+1個チェックすればいいのだ!」」 言われてみればそれはそう。そこまで見極められていなかったから、自分の提出(一応 AC)では貪欲さが足りなかったし、だから tinsep19 さんの提出 #40680322 のようにより厳しい打ち切り条件も採用できなかった。あと、セグメント木で解けるというツイートを2つ見たけどよくわからなかったので考えた。たとえば1行ずつ考えるとして、セグメント木には列ごとの合計値を記録する。行を移るときに同じ数字を二重に計上しないようにセグメント木上の数字を足し引き補正して、それから最大値を尋ねるのだと思う。ST でやったら WA×9 と微妙に間違えた。なぜ? ST クラスの内部配列のサイズを2べきに揃えるときに埋める値がよろしくなかった>AC。■ACL などまともなライブラリのセグメント木を使ったことがあれば単位元がパラメータ(の1つ)だということがわかったはずだ。この動画を見ていたら op と e の2つをテンプレートパラメータとして渡していて、「あっ、そうなんだ」とお勉強になりました。で、あらためて Wikipedia を読むと「定義……結合律…….単位元の存在……を満たすならば……モノイドという。」と書いてあるわけ。だけどね、痛い目を見るまではそういうお約束的な決まり事って無視しちゃうよね(イケナイ)。■これまでで 15 番目に良い順位だっただけに unrated の無念もひとしお。一入はありふれた漢字の組み合わせで難読。一目で覚えたい。


2023年04月14日 (金) 20230309 にも書いたけど『人はどこまで合理的か?』(スティーブン ピンカー)をまだ読んでいる。今は下巻。基準率(base rate)という単語をこの本以外でも見かけるようになったけど(つい先日もツイッターで)、単に本で読んで知ったから目に付くようになっただけで、以前からあったのかもしれない。過去に読み始めたものの頓挫してる『データ解析のための統計モデリング入門 : 一般化線形モデル・階層ベイズモデル・MCMC』(久保 拓弥)を思い出させる内容もあって、なかなか厳しい。読み物ではあるけども。■またしても言葉について。下巻の 194 ページから、対立軸を例示して「たとえば階層主義か平等主義か、自由主義か共同体主義か、王冠と祭壇か啓蒙主義か、部族主義か世界主義か、悲劇的ヴィジョンかユートピア的ヴィジョンか、名誉を重んじる文化か尊厳を重んじる文化か、集団志向の道徳的基盤か個人志向の道徳的基盤かなど。」とあるが、名誉と尊厳の対立がよくわからなかった。これって同じ側の言葉に見える。思いつく原語は honor と dignity あたりなんだけど、日本語の意味が十分に掴めていないか、日本語にするときに重要なニュアンスが消えてしまっているか、なんにせよ理解が曖昧な部分があるとわかって気になってしまった。雰囲気で違いをでっちあげると、名誉は外から贈られるもので、尊厳は内から出てくるものかなと思ったけど、これまでそういう風に考えたことはないし、それが対立する状況も想像できない。こういうのに答えるの、ChatGPT が得意な分野という気がする。実際の使われ方から意味にあたるものを抽出すること。■■■@2023-04-26 別の本だけど『ファスト&スロー』(ダニエル カーネマン)の上巻 102 ページから、プライミング効果に関する内容だけどそのことではなくて例示されたものについて。「世界には、ひんぱんに尊敬を思い起こさせる文化もあれば、神を思い出させる文化もある。また、「親愛なる指導者」の大きな写真を使って、服従というプライムを国民に与える国もある。」 先々週(14日)に書いたように名誉と尊厳の対比はよくわからなかったけど、この本に書かれている2者+1は、人を上に置くか人の及ばないもの(神)を上に置くかという違いで理解してもいいだろうか。尊敬という一語だけで対象を人に限定してしまう用法に違和感があったけど、明鏡国語辞典によれば「「尊敬」は多く人間とその行為に限られるが、「敬う」は、尊い存在として敬意を払うべき高位のものに及ぶ(恩師[祖先・神仏]を敬う)。「崇める」は、敬うべき絶対的な存在に向けられることが多い(釈尊[神仏・太陽]を崇める)。」とあるのでむしろそういうものらしい。ひょっとしたら2つの本は同じことを指しているのかもしれないと思った。名誉=尊敬、尊厳=神威。無理か? それはそれとして、人と神の対比は、神格化される人がいたり神を代弁する人がいたりして曖昧に感じる。それよりも、人であるか神であるかにかかわらず自分の上に他者を置く心性、分を弁え身を修め奉仕する心のありようが共通していると思った。日本人が外国人に対して「無宗教です」と伝えるつもりで「無神論者です」と伝わってしまってやべー奴だと誤解されてしまうというエピソードがしばしば語られるけど、無神論者のやばさって、そういう心性の欠如として理解すればいいのだろうか。アナーキストに近い概念だと説明されることがあるけど、無宗教・無神論に対するイメージが実はよくわからない。無というよりは反で、反宗教的な活動家、みたいな?


2023年04月13日 (木) [AtCoder] 精進。20230409 に書いたように ABC123-D「Cake 123」(水 diff)。難しかった。ABC197-E「Kth Takoyaki Set」と似ているということで解法の見当がついた状態で挑んだけど、ひとひねりあって考えてしまった。制約を比較すると N の上限が 10 から 1000 へと増えている一方 K が 20 万から 3000 に減っている。列が3本あるのも違いだけど、それは最初に2本を組み合わせてソートして 100 万のソート列と 1000 の「値を増加させるプロセス」に転換できる。O(NK) が通る制約なのは同じだから、ここから同じ解法で答えが出る。じゃあどこに考え込む要素があるのか。プログラミングをする者の思考として共通部分を見つけて括りだしてまとめる傾向があると思う。100 万のソート列と 1000 のプロセスを組み合わせて K 個の値を大きい方から作り出す本処理を書いたとき、前処理で行った 1000 の列を2本組み合わせて 100 万のソート列を作り出す処理にも応用できないかと考えてしまった。一見できそうに思える。なんなら本処理よりも簡単にできそうに思える。というのも本処理では 100 万と 1000 を組み合わせるので迂闊に全体を一括して扱うと 10 億になって手に負えなくなる一方、前処理では 1000×1000 = 100 万なので雑に組み合わせて全体を一括処理して構わない。それなのに本処理と同じやりかたを前処理に適用しようとして N の3乗 TLE になりそうなことに気がついて、なんでそうなってしまうのか考え込んでしまった。■提出 #40551459 (AC / 267 Byte / 748 ms)。前処理と本処理を共通 M (マージ)関数にまとめることはできなかった。■Ruby によるすべての提出を見ると2桁 ms の AC がいっぱいある。自分の解法は ABC297-E の制約を見て考え出されたものであって、ABC123-D 向けには別の解法を採用すべきだったということ。ちなみに ABC297-E には他にプライオリティキュー解法と二分探索解法が存在している。自分が過去に ABC123-D で WA を出した解法は二分探索解法だった。もうすこし考えねばならぬ。■前処理で作成するソート列の長さを制限することができる。そうするとさっき書いたことに反して共通のマージ処理を使うことができる。2桁 ms の提出は長いものと短いものに二分できるみたい。長いものはプライオリティキュー解法で、短いものはソート済みであることを踏まえて賢く打ち切りながらの全列挙だった。


2023年04月12日 (水) 【画像あり】流石のお前らでも文句のつけどころがない天丼が発見されるwwwwwww : 暇人\(^o^)/速報 - ライブドアブログ」■エビイカは鉄板でいいね。でも案外エビがダメな人は多いね。あなごよりキスの方が癖がなくて嬉しいかな。ホタテがあると最高。ナスがないのはいただけない。中に含んだ水分が貴重なオアシスなので。他はお好きに、どうでもいい。だけどこれも案外に、玉子が好きな人は多いみたいだね。野菜を足すなら甘くて柔らかいカボチャがいい。


2023年04月11日 (火) [AtCoder]「AtCoderさんへ 有理数ジャッジを使う際に mod 998244353 で合同な整数を全部ACにするのをスタンダードにして浸透させましょう 今日のCF-D1Dのような悲劇が防げます どうかお願いします 物理好きより」■リプライにある Yes と YES と YeS とか余分なスペースとかについてまずは。たいていの言語は識別子の大文字小文字を区別するし自分が書くときにそこをいい加減にすることはないんだけど、では受け取るジャッジがどうあるのがベターかというと、そこは答えの本質ではないしあえて WA として切り捨てるほどの違いでもないかなと思う。メイリオあたりから全角数字へのアレルギーがなくなった者並の感想。何か、区別させたい人って国語のではなかったりするテストで漢字のトメハネハライくっつけるはなすの違いに赤ペンでチェックを入れる小学校の先生とダブる。Twitter でそういう画像が上がると「正解だろ」「国語のテストじゃないのに」って意見が目立つけど、自分は違いを知っていて崩すのと最初から区別する目を養う機会を奪われているのでは全然違うと思うし、小学校の先生って教科担当ってわけではないから、いまどきそういう手間暇をかけた指導はありがたく感謝していいと思う。立場がブレてますけども。意味のある違いかという判断が人と状況によって分かれるってことなんだろう。答えは出ない。でも判断が分かれるところで区別できないこと気がつけないことは不幸だと思う。そのことにどういう姿勢で臨むか。(問題ごとに異なるにせよ基本的に) ABC で区別されていて ARC/AGC で区別されていないらしいというのを初めて知ったんだけど、その違いに説明は付けられる。■mod について。直近の ABC297-F では「得られるスコアの期待値を mod 998244353 で求めてください。」という問題文の直後に折りたたまれて補足説明的な感じで「(前略) R×Q≡P(mod 998244353) かつ 0≤R<998244353 を満たす整数 R がただ一つ存在することが証明できます。この R を求めてください。」と書かれていて、答えの範囲が疑問の余地なく書かれてはいるんだけど、mod 998244353 で求めてください、という本文に立ち返ると 3 (mod 2) って 1 (mod 2) のことではなくて 2 を法とするとき 3 と 1 が区別されないってことなので、998244353 以上の答えがなんで間違いになるのかなという気持ちになる。一方で、OLE という最レアジャッジがあるので無制限にリソースを奪われる心配もないはずだけど、ジャッジのコストやプログラミング言語の整数型サイズなど現実的な判断として 0≤R<998244353 の範囲で一意に決まる数(R)を答えてくださいという要請も理解できる。ただし真の値を 32 ビットの範囲に丸める便宜的な(本来の意味で姑息な)やり方ではあると承知していていい。最近読んだ「新しくプログラミング言語を作る際に数値型をどうするべきか」みたいな話で、今の当たり前がいつまでも当たり前ではないと思うし、ましてや今の当たり前から外れることが「キモい」なんてことはないはず。


2023年04月09日 (日) [AtCoder] 今日は ABC297 があった。自分のすべての提出コンテスト成績証。DEF 問題について書く。■D 問題「Count Subtractions」(灰! diff)。数学問題苦手。でもまあ、エラトステネスのふるい……じゃねーや、ユークリッドの互除法の名前は忘れてたけどどういう処理かは精進(20191118p01, #8508807)のおかげで知ってますよ。Ruby 2.3 の頃は余り付きの pow メソッドがないから逆元の計算に苦労したのだ。■E 問題「Kth Takoyaki Set」(緑 diff)。N≦10 が特徴的な制約。10 個以下の数を重複ありで組み合わせて K 個の数を作りたい。効率的にソート列を伸ばしていく方法は。たとえば値を増加させるプロセスが1つだけなら、与えられたソート列と、処理済みのソート列の2本の配列を持って、2つの配列の先頭の要素を見比べて小さい方の値を取り出して処理して処理済みのソート列の末尾に追加することでソート列をどんどん伸ばしていける。それは 20190916p01.0120220129p01.06 に書いた。今日の問題への応用は。(1)1本のソート列に 10 のプロセスが張り付いて次の値を提案する。(2)ふさわしい値をソート列の末尾に追加する。(3)次の値を提案するために各プロセスがソート列上を少し後ろに移動する。という感じ。提出したスクリプト8行目の while 修飾子は if 修飾子で十分だった気がする。提案した値が採用されたプロセスだけが添字を +1 するだけのはずだから。Ruby でプライオリティキューは定数倍の重さが致命的になりがちでできるなら避けたいところ。■F 問題「Minimum Bounding Box 2」(青 diff)。類題を何問か解いている。「Black and White Rooks」(20220306) と「AtCoder社の冬」(20211222)。だから処理の流れはわかったうえで、TLE にならないように同じ数え上げを省く効率化を間違えずにやることに専念して、1時間以上苦しんだ。全部を一度にやるのは難しいから、全然答えが合わなくてそれを痛感したから、愚直解を書いて答えを合わせてから、その式をにらみながらリファクタリングをするようにした。最初に行方向の数え上げだけを効率化して提出してみたけどきっちり TLE になったので、残ったわずかな時間で列方向の数え上げも効率化してぎりぎり(2つの意味で)時間内に間に合った。「けっこう制約が優しくて、ループ内で愚直にスキャンして掛けて足し合わせても間に合いそう」だった先の2問よりも厳しい。厳しいのになんで黄 diff より下の青 diff 止まりなのか。水色の自分が通しているからか。■E 問題が Cake 123 に似てるというツイートを読んだけど、自分はその問題は WA で投げ出している。これが次の精進候補かな。■■■@2023-04-12 F 問題。解説の方法でやってみた。提出 #40569324 (AC / 508 Byte / 812 ms)。なにこれ簡単。h×w の枠を H×W の内部で動かすとか、累積和で DP を高速化するとか、まるで関係ない。足して引いて足して割るだけ。なにそれずるい。■もうひとつの解説のやり方もやってみた。提出 #40569949 (AC / 644 Byte / 1081 ms)。この形は見覚えがあるなあ。AtCoder社の冬への自分の提出 #28054417 だなあ。こちらは枠を動かすステップがあるけどそれでもまだ簡単だなあ。ずるい。ループを通して相殺される足し引きを予めまとめておかないと間に合わないくらいの努力が要求されたんだよ、最初の提出(#40491985)では。