/ 最近 .rdf 追記 設定 本棚

脳log[2023-05-24~]



2023年05月24日 (水) 2023030920230414 で読んでいた『ひとはどこまで合理的か?』(スティーブン ピンカー)に続けて『ファスト&スロー』(ダニエル カーネマン)を読んでいる。現在は下巻のプロスペクト理論の章で、ベルヌーイの富の効用理論の限界を明らかにするための問いかけへの自分の答えが見事に想定から外れていたので、そういうのが大好きなので、紹介したい。■下巻 94 ページから。「問題3 あなたは現在の富に上乗せして一〇〇〇ドルもらったうえで、次のどちらかを選ぶように言われました。五〇%の確率で一〇〇〇ドルもらう、または確実に五〇〇ドルもらう。問題4 あなたは現在の富に上乗せして二〇〇〇ドルもらったうえで、次のどちらかを選ぶように言われました。五〇%の確率で一〇〇〇ドル失う。または確実に五〇〇ドル失う。」■2つの質問への答えを決めてから読み進めると書いてあったのは、「たぶんあなたはたいていの人と同じように、次のような反応を示すだろう。問題3では大方の人が確実な方を選ぶ。問題4では大方の人がギャンブルを選ぶ。」「あなたは選択を決める前に、問題3では一〇〇〇ドル、問題4では二〇〇〇ドルを「もらった」はずだが、そのことに十分注意を払っただろうか。たいていの人と同じなら、そんなことは気にも留めなかったはずだ。この「プレゼント」は参照点に含まれてしまい、参照点は無視されるのがふつうだからである。」「またあなたは、損得に対する自分の態度が、富の状態の評価に必ずしも左右されないことも知っているだろう。一〇〇ドル得をするのが好きで一〇〇ドル損をするのが嫌いなのは、富の増減の問題ではなく、単に勝つのが好きで負けるのが嫌いだからである。そしてまずまちがいなくあなたは、勝つことを好む以上に負けることを嫌う。」■自分の答え。問題3ではダブルアップチャンス(ギャンブル)を選んだ。問題4では確実な損失を選んだ。どちらも想定の反対だ。どういう心理かというと、問題3ではすでに一〇〇〇ドルというあぶく銭を手に入れていて、ギャンブルを選んでもそれを取り上げられはしないので、追加でもらえなくてもその嬉しさは減らない。一方で確実に五〇〇ドルもらうよりも倍額の一〇〇〇ドルを確率でもらうギャンブルに勝つ方が喜びは大きい。問題4では、すでに二〇〇〇ドルという十分に大きなあぶく銭を手に入れているので、それが確実に五〇〇ドル減ることに痛みは感じない。感じない痛みを取り除くために失う額を倍にするかもしれないギャンブルに参加することは、痛みや悔しさを生み出すマイナスばかりが目立つ。■どうだろう。たぶん国民性みたいな傾向もあるんじゃないかな。自分の答えは日本人の標準だと信じている。だって完全に自分の利益と感情に従っていてこれ以外の答えは考えられないんだから。■とはいえ、得するチャンスを逃したことをあとから知って、本気で損をしたように感じたり、(そこに他者が関わっていたことで)損をさせられたと感じれば腹を立てたりする、自分と異なる考え方をする人が存在することも知っている。自分の感覚ではあると知ってすらいなかったプラスのチャンスを逃したことはただのゼロであり、そこに悔しさはない。事前に知って皮算用をしていたとしても、参加費がゼロならリターンがゼロでも惜しむ対象がない。でもそうは考えないやっかいな(説明ができない)人もいる。■いやまあ、説明だけならできる。本の同じ部分(97 ページ)に書いてある。「金銭的結果の場合には、通常の参照点は現状すなわち手持ちの財産だが、期待する結果でもありうるし、自分に権利があると感じる結果でもありうる。たとえば、同僚が受け取ったボーナスの額が参照点になることは、大いにありうるだろう。」 参照点が異なっているだけなのだ。どうして参照点をそこに置いたの? って疑問がやっぱり理解できずに残るわけだけど。


2023年05月21日 (日) [AtCoder] 精進。昨日の ABC302-F「Merge Set」(水 diff)。ネタバレを読みました。「アライグマ「F問題は超頂点を使う最短経路問題なのだ! ABC184Eが類題なのだ」 https://t.co/vn6YsG0fOO」。集合と集合の要素の両方を頂点にして二部グラフを構成するといいらしい。昨日書いたように自分の頭ではそれがわからない。「BFS も考えたけど隣接頂点リストが膨大になりそうで諦めた」。■提出 #41606573 (AC / 455 Byte / 508 ms)。実装はなんの問題もなくできる。操作回数を数える位置だけちょっと悩んだ。


2023年05月20日 (土) [AtCoder] 今日はトヨタ自動車プログラミングコンテスト2023#2(AtCoder Beginner Contest 302) があった。コンテスト成績証自分のすべての提出。所要時間が A=1分、B=31分(+5分)、C=3分、D=8分、E=12分(+5分)、G=33分。B 問題で沼ったのとケアレスミス2つが反省点。以下ふりかえり。■A 問題「Attack」。繰り上げ整数除算。A が1以上の制約であることを確認してから (A-1)/B+1 と書いたけど、だったら (A+B-1)/B と素直に書けばいいと思う。負数の整数除算は 0 に近づく言語と負の無限大に近づく言語があって、Ruby の場合はたとえば (-1)/2 が -1 になる。わざわざ括弧を付けたのは、たとえば 0-1/2 が 0 になるからで、負号がリテラルの一部(もしくは単項マイナス)であることを明確にするため。めんどくさ。■B 問題「Find snuke」。いまもって分からないこの条件文「A1​,A2​,A3​,A4​,A5​ の中心はこの順に一直線上に等間隔で並んでいる」。中心ってどこ? さておき、単にグリッドを全探索する問題なのだけどどこではまったのか。次の文字を探索するときに方向を固定するのを忘れていてジグザグに探索してしまっていた。それで答えがいくつも出てきて困っていた。さらには WA も出してしまって、そこから6分で別バージョンの解答を書き上げて AC を得た。つまり6分で解けたはずだよねってこと。コンテスト終了直後に WA 提出を眺めていてバグを見つけたので出し直して AC にしておいた。8方向の遷移先のうち1つがずれていたのが原因。'snuke' の各文字に対応したクロージャをチェインして出力に繋げる実装ってちょっとおもしろくないですか? Array#inject メソッドがはまりすぎ(なので WA のままにしておけなかった)。■C 問題「Almost Equal」。制約がごく小さいので愚直に並べ替えて愚直に比較して答えを出した。■D 問題「Impartial Gift」。D は DP の D……ではない! 差が一定以下で和が最大になるものだから、条件を満たす A の要素のうち最大のものと条件を満たす B の要素のうち最大のものを見つけて、いい方を答えにすれば良い。条件とは、現在見ている要素を a として、a-D から a の範囲の値が他方の数列に見つかること。■E 問題「Isolation」。UnionFind だと辺の削除はできないんだよね。注目するところは、辺の数はクエリの数を超えないということ。集合(Hash)で個々の辺を管理して許される。あとは辺の数が0と1のあいだで変化するのを掴まえて孤立頂点の数を管理する(変数名の o は orphan の o だよ。次数0の o でもあるかな)。サンプルの2が優しくて(「2 番目の種類のクエリを行う直前の時点で、すでにその頂点と他の頂点を結ぶ辺が 1 本も存在しないこともあります」)、ペナルティを食う前にすぐ修正して提出したよね。いや、それでもペナルティは食らったんだった>WA。一度は書いた E[a].clear がいつの間にか消えていたのが原因。■G 問題「Sort from 1 to 4」。もっと難しい類題を解いたことがある>ARC124-D「Yet Another Sorting Problem」(20211125)。あるいは UTPC2021-A「Make UTPC」(20220511)。今日の問題では、1から4の場所に納まるべき1から4の値の列が与えられる。ソートすればどの範囲が1の場所でどの範囲が2の場所か……ということがわかる。位置と値が一致しているなら交換は不要。1回のスワップでお互いの位置が正しくなるペアがあるならスワップして損はない。次は位置を交換している3つ組を見つけて2回のスワップで位置を正す。ここまで実装してあとはどうしようかと作業配列をインスペクトしながらサンプルを実行していたら、サンプルの2が神だった。残りは4つ組だけしかありえないので不一致の数を合計して÷4×3で OK。■F 問題「Merge Set」。名前からするとマージテクとかマージソートでうまくする問題かなと思うけど、うまい道筋をまだ見つけられていない。(ツイートを読んで書くんだけど) BFS も考えたけど隣接頂点リストが膨大になりそうで諦めた。ひょっとしてあなた(私です) M 個の値を頂点にしようとしていませんでしたか?■B 問題。今理解した。「5 つのマスの組 (A1​,A2​,A3​,A4​,A5​)」という自己紹介がちゃんとあった。A よ、お前マスだったのか。■G 問題。「@kyopro_friends なるほど。書き方的に一般に成り立つように見えたので、例えば数が 6 種類あると上手く行きませんというのを伝えたかったです。」 うーん、わかりませんねえ。位置を正す方法(経路)に複数の選択肢があって、貪欲法では良くない経路を残してしまうのかなと思ったけど、そういうケースが作れないのと、そういうときにどういう方法がとれるのか。


2023年05月16日 (火) [AtCoder] 精進。AGC047-A「Integer Product」(水 diff)。以前に解こうとして解けなかった問題。小数部分を9桁に固定した固定小数点数として扱って、2の因数と5の因数を数えて 10 が 18 個以上作れる組み合わせを数えるというところまでは以前も考えた。いったい何がわからなかったのか。たぶん A 数列の組み合わせを考えようとして O(N^2) をどうにかする方法がわからなかったのだろう。でも考えてほしい。2 の因数も 5 の因数も 18 個までしか数える必要がない。A 数列の各要素は 18×18 の平面にプロットできる。そうすると組み合わせは 19^4 ≒ 13 万通りしかない。■提出 #41467175 (AC / 511 ms)。同じ要素を組み合わせないようにだけ注意。そこはひっかからなかったけど入力を固定小数点数化するところでバグらせて、0の数がときどき1多かったりした。こういう添字と数の変換って指を使ってよくよく数えるんだけど間違えるんだなあ。


2023年05月15日 (月) 長らくのご利用ありがとうございました。 : モトアサイン」■なんの関係もないけど読んでたブログ。最近更新が滞り気味だと思っていたら……。過去の記事全部消しちゃったの? それは何かを否定するような行為に見えて賛同はできないかな。当人の意思とすればよく理解はできるけども。所詮は赤の他人の言うことだけど。読者だったから惜しいと思う。


2023年05月14日 (日) [AtCoder] 今日は ARC160。配点 400-500-500-(あとは知らん) はゼロ完あるで。参加賞は茶パフォかな。■A 問題「Reverse and Count」。数列を前から見ていく。その値が a であるとする。a より小さい要素が右側に sub 個あるとして、K<sub であるなら、右側にある小さい方から K 番目の要素と a を範囲とする操作が答え。さもなければ、a を含む a より左側の数列の並びをそのまま温存するような操作がいくつあるかを考える。a の左に l 個、右に r 個の要素があるとすると(l+1+r=N)、evn = l+1+r*(r+1)/2 回の操作が a までの数列を固定する。これが K-sub を超えるなら次の要素に処理をまわす。今は a の位置に a より大きい要素を持ってくる操作を考える。a より右にあって a より大きい要素のうち K-sub-evn 番目の要素と a を範囲とする操作が答え。説明しててもわからん。難しいね。提出 #41421021 (AC)。1時間半ちかくかけて 2WA のち AC。■C 問題「Power Up」。これは精進。最初は素朴に A の要素を小さい方から処理するのだと思った。個数を数えて何回の操作が可能か数える。そして次の要素の個数を操作回数分だけ加算する。それではだめなのだな。たとえば現在の要素が a であるとして、最初 n 個あったとする。最大限の操作を駆使して n+c 個まで増やすことができるとする。n+c 個を操作対象にするとき a 以下の要素から成る集合の多様性が最低になる一方、もともとあった n 個の範囲内で操作をしたりしなかったりする場合は、a 未満の要素を対象にした操作にはなんの制限もかからず集合の多様性が最大になる。というのをどうやって管理して数えるのか。提出 #41424512 (AC)。A 問題の AC から1時間後でコンテスト終了からは 30 分後の AC。かかった時間を考えると A 問題の配点は低かったと思う。■B 問題は苦手な苦手な ABC-D の臭いがしたし、ARC の問題ならさらに難しいに決まってるので一瞥だけして飛ばした。正しい判断だったと思う。■■■@2023-05-17 精進。B 問題「Triple Pair」(ぎりぎり水 diff)。動画を見た後でいまさらだけど、x≦y≦z を仮定して並べ替え(6通り3通り3通り1通り)を考えるところまではすぐに考えた。2数の積が N 以下なんだから入力の平方根の範囲で全探索できることもわかる。でもコンテスト終了後にちょっと考えたときは z に関してループを回していた。それは難しくない?■提出 #41484353 (AC / 180 byte / 350 ms)。動画で見た通りに y についてループを回した。普通に ABC-D だったと思う。ただし苦手な苦手な ABC-D ではある。


2023年05月13日 (土) [AtCoder] 精進。今日あったパナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)-E「Pac-Takahashi」(青 diff)。最初はメモ化再帰だと思った。「順列総当たりが許されない制約(N≦16)だけど、A<B、A>B を区別せずに2回目以降の数え上げがサボれるなら許される」制約だったから。でも実装を始めるとパラメータが多くてうまくメモできなかった。そのうちに TSP とかワーシャルフロイド法が見えてきた。■最初の提出 #41382752 (WA×19)。無効値が -1 と T+1 の2種類あって、-1 がうまく扱えていなかった。■2番目の提出 #41386679 (WA×5)。パックマンの餌が1個もない場合に答えが nil になってしまっていた。■3番目の提出 #41392115 (AC / 3117 ms)。無効値を T+1 に統一したり多重ループの一番深い部分を効率化するなど清書しているうちに WA×5 の原因がひらめいて、制約を確かめたら間違いなさそうだった。終了から5分3秒後の AC。一番悔しいやつ。■コンテスト成績証。上がるんだ……。喜べないかな。■■■ABCD のふりかえり。A 問題「Overall Winner」。Array#tally で集計して出現数を比較する。同数なら最後の文字を見れば答えられる。Array#tally を使うとき出現数が 0 のときに nil が返るのが予想外で実行時エラーを起こしがち。■B 問題「Fill the Gaps」。隣接2項を見てあいだを補完する。Gateway Timeout のせいで最初の提出は虚空に消えた。その後も E 問題で提出が消えたり、消えたと思わせてちゃんと WA になっていたりした。だから再提出前には提出一覧を確認したんだよ、ペナルティを重ねないために。■C 問題「AtCoder Cards」。これも Array#tally で集計した。'atcoder' の各文字に対してはオールマイティ(@)が使えるが、それ以外の文字は出現数が正確に一致していなければいけない。数の一致とオールマイティの数が足りているかを確かめた。■D 問題「Bitmask」。すべての ? が 0 だったとして可能な最小値を求めて N と比較する。あとは最上位の ? から順番に 1 に変えてみて、N を超えない限りはさっきの最小値に加えていく。こういう数の扱いは BIT#lb メソッドの実装でなじみがある>#38427641。典型力について書かれた「chokudaiのブログ」にも言及があるよ(「この一連の操作のコストは(書き換えた要素の数によらず)2^k である。」「kを使った場合のコストは、k-1以下のすべてを使ったコストより高い」)。自分は「わかる」のではなく「知っている」だけなのだ。最小値を求めるときに String#to_i を無引数で呼び出してしまって1ペナ。


2023年05月12日 (金) また「英語と日本語の間に空白を入れる/入れない」の話を見かけますが、趣味や好みや習慣の話は別にして、業界的には「和欧間にアキはあるべきだがそれは空白文字であるべきではない」でFAです」「ようするに「空白文字でテキストの見た目をどうにかしようとするな」なんだよな」「まあ、とはいえです。たとえば「LaTeX文書における段落内の改行」はどうなんだという話にもなるわけなので、絶対の何かがあるわけではないです。和欧間のアキも個人の文書では好きなように書くのでいいと思いますが、少なくとも「空白文字を挿入すべき」とは言えないというのが大意です」■コンチョクのはなし。いくらか前から現在まで自分は日本語と英語の境界にスペースを入れる派閥に属している。ついでに言うと数字と単位のあいだにも入れるようにしている(日本人がやりがちな間違いとして英語圏の人が指摘しているのを読んでから。欧文ルール? 単位が匁とか町のときの正解は知らない。算数ルールでは単純な数字ではなくて式のとき式と単位のどちらかに括弧を付けると習った気がする)。その方が間違いなく(プレインテキストであっても)見た目が整うからなんだけど、それを指して空白文字で見た目を作っているつもりはないのだな。スペースの部分までが英文ルール(単語の分かち書き)というつもり。たまたま隣の文字がひらがなやカタカナや漢字だったからって、英単語の前後にスペースを入れない(入れてはいけない)理由にはならないと思うん。「和文の文字組みの都合でしかないとも思う」に同意するってこと。■関連して RFC 3492 に広末を探しに行ったら予想外にブリグリを見つけて嬉しくなってしまった。どれでしょう。(N) だよ。■関連するようなしないような、和製メディアプレイヤーがやらなくてたとえば Songbird がやっている処理。the brilliant green という名前やタイトルがあったとして、これを T の並びに加えるのが和製で、B として並べるのが Songbird。午前/午後/AM/PM の使い分け(0時12時前置後置)とあわせて注目したい微妙な差違。総じてよそ者の扱いが雑なのではないかな。■ツリーをたどっていたら最初の一連のツイートの人が「意味に立ち返ると "de" の機能として空白が必要な箇所だと思うので、編集者として仕事をするときにはわりと自明に「空白文字を入れる」になりそう」というケースもあることを書いていて、えっと、業界ルールが謎です。特に固有名詞に関して意味を優先するのはまったくわかりません。


2023年05月11日 (木) 私は異なる人々にこの話をしてきましたが、プログラマは一様にこの話を聞くと 歓喜するのに対して、経営者は目に見えて不機嫌になりました。 いっぽう純粋な数学者は、なにが面白いのか理解できないようでした。」■難しい。反応をどう解釈していいのかよくわからない。プログラマは歓喜するらしいけど、高級言語しか使えないようなダメなプログラマは操車場のように低レベルな現場で巻き起こる騒動には考えが及ばず、当たり前のように2種類の車両が交互に向きを揃えて整列してると考えてそう。それは私です。経営者が不機嫌になる理由がたぶん自分と同じ期待を当初から持っていたからだと思う(「調査してみると、経営者の決定がきちんと操車場に伝わっていなかった」)。それなのに最終的な解決方法が現実的ではあっても理想に届いていなかった(「ささいな問題として……」)。数学者の興味をひくには、数学者の言であるとされる「あなたの話は具体的でわかりにくい。もっとわかりやすく抽象的に説明してくれませんか?」がヒントになりそう。話が具体的すぎた。最後に、ペアを考えることで解けた競プロの問題を嬉しそうに挙げておきますよ。灘校文化祭コンテスト 2022 Day1-D「Double Permutations」(20220504)


2023年05月08日 (月) [AtCoder] 精進。ARC102-D「All Your Paths are Different Lengths」(青 diff)。やることはまあまあすぐにわかる。数値の2進表現をグラフに直す。L と N の制約がそのような配分になっている。ビットごとに頂点を割り当てて隣接ビットへ1の辺(重み2べき)と0の辺(重み0)を張る。それだけだと L がフルビットでないときに困るけど、1のビットに対応してそのビットが最初に倒されるビットである場合を表す辺を張る。■提出 #41255174 (WA×7)。こういうジャッジスクリプトを使っていた>judge.rb27。入力される L の上限は 20 ビットある。そのときに N=21 となる答えを返していたのが WA の原因。N は 20 以下に制限されている。L のビット数+始点1+終点1くらいの頂点を使わせてくれてもいいと思うけど、L のビット数と同じだけしか許されていない。■提出 #41257168 (AC)。すごく苦しんだし、その過程では3進数でやろうかとも考えたけど、結局、始点と始点に隣接する頂点を機械的にマージすることで答えが合った。いらん苦労だったと思う。制約が無駄に厳しかった。あるいは上手い考え方があったのか。■提出 #41260968 (AC)。3進数でやった。たぶん最大ケースが L=531440(10)=222222222222(3) で、解答が N=13;M=57 になる。M が上限の 60 に近いがセーフ。あんまりややこしいので初めて秘密兵器(ノート)を使った。ノートを見れば明らかだけど、2進数であるか3進数であるかにかかわらず、自分が考えるとどうしても桁数+G(終点)の頂点を使ってしまう。MSB を S(始点)として使用してもだ。だから2進数でやったときに L のビット数+1を使ってしまって制約を1だけ超えてしまった。■3進数で真の最大ケースは L=885734(10)=1122222222222(3) だったかも。このとき解答は N=14;M=60 になる。上限いっぱいでぎりぎりセーフ。辺の制約(M)がキリよくおおざっぱなのに対して頂点の制約(N)がタイト過ぎて無駄に解答の様式(=ただの形。記述の癖以上のものではない)を縛ってると思うんだよな。


2023年05月05日 (金) [AtCoder][Ruby] 普段のコンテスト参加スタイル。AtCoder でジャッジに使われる Ruby が今のところ Ruby-2.7 なので C:\Program Files\Ruby27 にインストールして、コマンドプロンプトで ABC300.rb27 とか ruby27 ABC300.rb27 で実行できるようにしている。■方法は? ruby.exe の名前を ruby27.exe に変えるのはあまりうまくなさそうだし、ruby27.exe という名前のシンボリックリンクを他所に作っても x64-msvcrt-ruby270.dll みたいなライブラリにパスが通ってないと実行できないしで、~\Documents\PATH という名前のフォルダをパスの通ったフォルダとして用意して、ruby27.bat という名前のバッチファイルを置くようにしている。中身は次の2行だけ。@set PATH=C:\Program Files\Ruby27\bin;%PATH% @ruby %* 他にも ruby18.bat、ruby19.bat、ruby25.bat、ruby31.bat、irb27.bat、ruby27-prof.bat とかのファイルがある。Ruby-1.9 のあと AtCoder に触れるまで Ruby から離れていたことがわかりますね。原始的だけど面倒がない。■デスクトップに空の ABCxxx.rb27 ファイルを作成してサクラエディタで開いて、コマンドプロンプトも開いて準備完了。ブラウザとエディタとプロンプトを行ったり来たりしてる。あとアニメとかの動画をデスクトップいっぱいに最大化して再生してる。静かすぎるのも集中できないものらしいですよ。オートインデントだとか補完だとか整形だとか構文エラーの指摘だとか、機械に不随意に横から茶々を入れられるのが耐えられないのでエディタには多くを求めていない。■BIT とプライオリティキューとセグメント木と組み合わせの事前計算をイチから書くことはもうないので、そのときはエディタの GREP 機能(Ctrl+G)で過去ファイルを漁っている。プライオリティキューとセグメント木にはバグったものが混じっているのがわかっていて、うっかりしていると過去のバグを再現してしまう。■コードテスト勢(実在をやや疑っている)よりはよく準備してると思う。言語リファレンスはここ☞。できることは全部リファレンスに書いてある。専ら Array#insert の第一引数と第二引数のどっちがどっちだったかと、ビット演算子の優先順位を確認するのに使っている。他に競プロで使うようなものはだいたい覚えてるかな。Ruby だけだからね。C++ で書こうとすると cpprefjp が手放せない。■こういうお役立ち記事があるのは知っている。「RubyプログラマがAtCoderの環境をatcoder-cliとonline-judge-toolsで快適にしてみた - Qiita」。使われているのはどれも有名どころのコマンドで、AtCoder に限らず使う機会が多くあると思う。参考にしてまったく損はない。だからそうでない原始人スタイルもあることを書いた。


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 の連続を一体で扱わなければいけない。