/ 最近 .rdf 追記 設定 本棚

脳log[2022-09-06~]



2022年09月06日 (火) [AtCoder] 精進1。先週末あった NECプログラミングコンテスト2022 (AtCoder Beginner Contest 267)-F「Exactly K Steps」(青 diff)。木があって任意の頂点から任意の距離にある頂点(の1つ)を高速に求める問題。■提出 #34603482 (WA×14/TLE×2)。木の中心と、中心から出る頂点のうち2つの頂点について考えた(すべてを考えると星型の木で死ぬ)。与えられた頂点 U と中心と中心から出る頂点のうち U を含まないものがわかれば答えが出せる。距離 K が U の深さより大きいなら、中心から出る頂点のうち U を含まないものを根とする距離表を定数時間で引く。距離 K が U の深さより小さいなら、ダブリングで U の親をたどる。WA だった原因は中心を正しく求められていなかったことで、TLE の原因はダブリングのためのデータ作りで配列の比較を繰り返していたことだと思う。■提出 #34645281 (AC / 1549 ms)。WA の原因が誤った木の中心にあることを突き止めているあいだに、そもそも木の中心がいらないことに気がついた。木の直径の両端にある2頂点のどちらかを根とする木において U から K 個上の祖先をダブリングで求めれば良い。無駄にややこしくして無駄にバグらせていた。■いやしかし Ruby 最初の AC 提出 #34576790 の 41 行目に center = now #中心 とあるな。……使われてないけど。770 ms と自分の倍くらい速いのなんで? 直径を構成する頂点のリストを用意して、U から直径までの距離を愚直に(1ずつ)数えてる。1回のクエリごとに高々半径と同じだけの遡行回数で直径に行き当たるだろうけど、それでいつでも大丈夫? しかしこんなややこしいことをしていて早いし速いし間違えてないのすごいなー。■直径を幹として他のすべての頂点を幹から分かれた枝(※)と見る木のイメージはこれまで持ったことがなかったなあ。※枝の長さは分枝点から直径の両端までの距離のうち短い方より短いか同じ。■提出 #34582537 (tinsep19 さん / 1606 ms)。クエリ先読みもありか。そうか。まねまね>提出 #34647156 (AC / 1826 ms) うーん、遅い。■■■精進2。先週末あった ARC147-C「Min Diff Sum」(青 diff)。コンテスト中に三分探索を書いていたんだけど、そのときも今日も3分点を求める式を間違えていた。(l+l+r)/3 とか l+(r-l)*0.3 が書けなかった。もっとも、それが書けても不満度を妥当な計算量で求めるのがまた難しかったんだけど。この部分問題には ABC の C 問題と D 問題の中間くらいのポジションをあげてもいいと思う。■提出 #34655113 (TLE×23)。三分探索が書けて判定式が書けて不満度の計算ができても、ローカルで6秒かかっているのでジャッジサーバーでは3秒くらいかかると思う。TLE。■提出 #34656235 (AC / 746 ms)。ループの中の線形時間の処理を累積和+二分探索に書き換えて AC。■提出 #34660104 (AC / 1739 ms)。整理していくと結局区間の左端の数と右端の数を数えるだけになって、三分探索も二分探索も不要になった。速くなるかなと思ったけど倍以上遅くなった。さっきの 746 ms がソート(NlogN)+累積和(N)+二重探索(log^2(N))で、今度の 1739 ms がソート(NlogN)+線形探索(N)。オーダーは O(NlogN) で変わってないけどね、だからこそこんなに差をつけられて、しかも負けてるのが納得しがたい。考察が進んで遅くなるとか……。ローカルで若干速くなってるものがジャッジサーバーでは2倍遅くなってたりするから、ジャッジが詰まりまくってた影響があったりする? あとローカルでは入力の受け取り方を変えるだけで3秒が2秒になったりした。入力サイズがでかい。■提出 #34661754 (AC / 658 ms)。ちょこっと速くなった。二重探索に対して妥当な改善だと思う。


2022年09月05日 (月) 今日読んでた本に「あたうる限りの努力」という初めて見る表現があって、気持ち悪いなあと思った。それ以前から「できうる限り」というあまり珍しくない表現も気に入らないと思っていた。だってね、「~しうる」という表現にすでに可能の意味があるのに、~するの部分にできるを当てはめるのは二重表現に思えてくどい。「できる限り」で十分なところでもったいぶって「できうる限り」なんて気取ってんじゃねーよ、という感想が先に立つ。■「あたうる限り」はどうか。これには「できうる限り」の「できる」にさらにもったいを付けて「あたう」に置き換えただけではない悪さを感じる。つまり、「~しうる」に接続するのに「あた(う)」でいいのですか、という疑惑。あたうの「う」と~しうるの「う」の音が同じだから、つい、くっつけちゃったんじゃありませんかという寸詰まりの据わりの悪さ。■「あたう(能う)」について ATOK で明鏡国語辞典を引いたら自動詞五段活用らしい。「~しうる」についても一応引いて、動詞の連用形とともに複合動詞を作ることを確認した。「あたう」の連用形とは何か。「あたい」になりそう? ところで、明鏡で「あたう(能う)」を引いたときにそのものずばりこう書いてあった。「「能う限り」を「能うる限り・能ううる限り」とするのは誤り」。2つの誤用例のうち「あたうる限り」の方は我が意を得たりでわかる。次に考え得るのは「あたううる」なの? 「あたいうる」の扱いがないのがアリだからなのかそれとも想定外なほど完全にナシだからなのか判断できない。もちろん「あたいうる」が仮に合法でも、気取ってんじゃねーよ、という感想をもつだけだけど。■■■珍しくない表現と問題提起だったらしい。「「あたう限り」? 「あたうる限り」?|NHK放送文化研究所」「「できうる限り」か「できる限り」か | 毎日ことば」「首相演説の「能うる限り」は「能う限り」の誤りでは? | 毎日ことば」 五段活用は五段活用でもワ行五段活用であるらしい。いくつかの活用形がないんだっけ? 連用形がなさそう?


2022年09月04日 (日) 「C言語のint型を正しく理解しているか?」クイズ。GCC/LLVM x86/x64の挙動を仮定した問題だが、はっきりいって超難しい。新山は2問目からコケた。 https://t.co/Esjrcid1hs」■やったよ>結果(PNG)。○が16で✖が4。最後の✖は選択肢が1つしかないのに不正解にされて納得いかないけど。■復習コーナー。「What does the expression SCHAR_MAX == CHAR_MAX evaluate to?」 char の符号が処理系定義なのは知ってたけど、処理系定義と未定義を混同した。だいたい符号付きにされるから成り立つ(1)のを正解にするってさ。それとあとになって気がついたけど、この問いに答えるには SCHAR_MAX と CHAR_MAX の型の異同について考えるだけでは足りなくて、int 型へ昇格されて比較された結果がどうなるかを答えないといけなかった。だってビットパターンは2つとも同じなわけだから(追記:嘘だよ。符号付き最[小]値と負号無し最[大]値の話になってるよ)、型が異なることが比較結果が偽となることを即座に意味しない。左のように書いてから疑いを持って検索したら、C++ のリファレンスではあるけどこう書いてあった。「具体的な値は実装依存であるが、127(2^7 - 1)以上であることが規格で定められている。このマクロによって定義される値の型は int である。」 SCHAR_MAX の型は最初から int であると。そんな気がしたぜ。ちなみに UCHAR_MAX についても「具体的な値は実装依存であるが、255(2^8 - 1)以上であることが規格で定められている。このマクロによって定義される値の型は、 unsigned char の全ての値が int で表すことができれば int、そうでなければ unsigned int である」とあるので、基本的に int であると。UCHAR だけど char でもなければ unsigned でもないと。■「Assume x has type int . Is the expression x<<0 ...」 負の数の左シフトはシフト数によらず定義されないそうで。■「Assume x has type unsigned short . Is the expression x<<31 ...」 unsigned short の昇格先としてつい unsigned int を期待してしまったけど、int で十分だから int だった。C 言語の int 好きを十分頭に入れてクイズに臨んだのにほころびが。■「Does evaluating the expression INT_MIN % -1 invoke undefined behavior」 最後の問い。選択肢が「Who knows」(不正解)しかない。他の選択肢があっても普通に答えが返ってくると思ってたから不正解で間違いない。これの結果を保証すると効率に響くという不都合な式らしいけど、コンピュータの気持ちで余りを計算することができないので INT_MIN の何がまずいのかわからず。ひょっとして -INT_MIN が存在しないことが関係する?■■■近くにあったツイートでこちらが目に入った。「科学としてのソフトウェア工学研究の危険性。ほとんどの「定量的な結果」は非常に限定された条件下でのみ意味があるのに、ときにそれを金科玉条のようにして議論が進められる。この結果起こるのは、データに現れない心理的な部分の軽視である。 https://t.co/Shrb4HQn6G」■この手の指摘をつい最近オープンダイアローグの文脈で読んだ。この本『開かれた対話と未来』。オープンダイアローグの個別的な性質から成果を科学的に評価するのが難しいそう。難しいけどやってるみたい。■英語が不自由なので流し見だけどリンク先を読むと、新型コロナのときにも見られた「根拠はあるんですか」を戒める内容ぽい。つまり、有望そう妥当そうではあるけどまだ根拠がない論を「根拠は?」で潰して、安い根拠をそなえた愚策次善の策をありがたがるなよと、そういう雰囲気。私見ですけどね、データが必要なのは凡人と秀才だけで、馬鹿と天才にはデータの裏付けなんていらんのですよ。問題はデータがないと馬鹿と天才が見分けられないことで……。


2022年09月02日 (金) 今日読んでた本のタイポ(ではなく思い違い)。2009年初版の312ページ、進化アルゴリズムの節。「優性遺伝 (survival of the fittest)」「優性を改善する(突然変異)」と書いてあるが、それぞれ「適者生存」「適性(適応性)を改善する」がふさわしいと思う。■適者生存にしてからが特定個人、集団の独善的価値判断に染められがちなのに(Wikipedia)、優性遺伝なんて用語では優性優生思想から容易に連想されるこのような勘違いが避けられないよね。他所の国で使われているらしい顕性遺伝が、性質をより的確に表した名前だと思う。変わったみたい。「中学理科「優性・劣性」から「顕性・潜性」に。遺伝の用語、2021年度から一斉変更 | ハフポスト NEWS


2022年08月31日 (水) 「こする」「擦る」という言葉の知らない用法をそれなりに見かける最近。どこから湧いてきた?■一番最近はこのツイート。「これ本当ガチ。格ゲー超強い人周りにいたら聞いてみ? 「躊躇なく強いキャラ使って、強い技こすりまくる初心者」と「弱キャラ選んで、無駄な事も基礎だと思い模索しようとする初心者」 どっちが現実的に花開くと思うか。 マジで前者って答えるから。前者の継続率と、後者の引退率、ほんまエグいから」■@2022-09-26 もうひとつ。「最近一番SFを感じたの、当時ネットで散々擦られた革命機ヴァルヴレイヴの「安らかに」ボタンがデジタル献花という形で実装されて普通に受け入れられてるっぽいことかもしれない。」 執拗に繰り返すの意?


2022年08月30日 (火) [AtCoder] 精進。ABC133-E「Virus Tree 2」(水 diff)。1日かかりました。影響するのが隣のノードだけならまだ考えやすかったと思うけど、隣の隣まで影響するのがいやらしい。F = lambda{|a,p,k| } のシグニチャが見いだせたら9割解けている。それがなかなか解らなかった。シグニチャとは、親が p である(p の色は決定済みである)ノード a が取り得る色が k 種類のとき、a を根とする部分木を塗り分ける通り数。■提出 #34462566 (AC / 262 Byte / 313 ms)。こんがらかった考えをお風呂で整理したら、9行目の K-1,K-2 の場合分けが自然に出てきて、するするっと実装が完了しました。昨日から何度も解けた気がしては答えが合わないということを繰り返していたのにね。


2022年08月27日 (土) [AtCoder] 今日は ABC266。Ex は知らないけど A から G までいやに素直でおやさしい問題ばかりの不気味な回。コンテスト成績証 - AtCoder自分のすべての提出。黄パフォが初めてならコンテスト中に G 問題が解けたのも初めて。それなのに最近ダメダメだったせいで Highest ではないし入青もしない。水色半ばに復帰したのみ。それでもできすぎた結果ではある。■@atgolfer1 を見たら終了直後の時点では C,D,F,G で shortest だった。Ruby で普通に書くと1つ2つはわりとあるのだけど4つはない。記念キャプチャ。■E 問題「Throwing the Die」は期待値。ダイスは複数形。ついこの前 ABC263-E「Sugoroku 3」がさっぱり解けなかったから 2022080720220809 で計3問解いていた。■F 問題「Well-defined Path Queries on a Namori」はなもりグラフ。ABC226-E「Just one」について 20211107p01 に書いてから知ってる。閉路検出の決まったやり方は知らないけど、反復的に葉をちょん切っていって次数が2から減らせないノードがループを構成していると判断した。親を記録した配列をそのまま UnionFind の Find 用のデータにしたのがうまかったと思う。だからどうという違いはないけど。■G 問題「Yet Another RGB Sequence」は組み合わせ。RG と R と G と B を並べるのだけど、R と G が余分な RG を作らないように注意する。それには RG と R と B を並べたあとで R の直後以外の位置に G を挿入する。同じ位置に複数挿入してもいいので重複組合せ(Wikipedia)で数える。Wikipedia に書いてある「証明4(組分けに帰着する方法)」を高校でやった。■D 問題「Snuke Panic (1D)」に G 問題と同程度の時間をかけた。D は DP の D! DP の D は解けない D!


2022年08月23日 (火) [AtCoder] 精進。ARC008-D「タコヤキオイシクナール」(ぎりぎり橙 diff)。読みました。「Atcoder Regular Contest_008_D_タコヤキオイシクナール - garakutagoya」 セグメント木に関連してモノイドという単語をこれまでも目にしてきたけど、式(関数)が乗せられるということに感覚が追いついていかない。■提出 #34300251 (AC / 655 Byte / 562 ms)。以前の ST 実装で .min だった部分を .then(&@m) に書き換えただけで通ってしまうのだなあ。あと細かいことだけど、コンストラクタに lambda を渡したのは失敗。ブロックが普通。


2022年08月20日 (土) [AtCoder] 今日は ARC146 があった。それほど悪い日ではなかった。A 問題「Three Cards」を丁寧にそこそこ早く書いて9分で AC した>提出 #34165283。ちなみに灰 diff。B 問題「Plus and AND」(水 diff) は時間中には 307 ms オーバーの TLE 解しか作れなかった。Crystal なら通っていたと考えることもできるけど、終了15分前の2完遅解きと1完早解きでは期待するほどのパフォーマンス差はないので、終了後でも AC できたのが良かった。■B 問題解答の紆余曲折。提出 #34170444 (WA×55)。最初の提出は派手に間違えた。サンプルの1を見ると、解が X のとき、K 個の A 要素が A&X==X になることがわかる。X に立っているが A に立っていないビットがその要素に必要な操作回数であり、A に立っているが X に立っていないビットが節約できる操作回数だと考えて式 b = a^x; (b&x)-(b&a) を書いた。これの間違いは A の方が X より大きな MSB を持つときに、それを操作(足し算)回数の節約には利用できないし、ましてや負の操作回数によって操作回数を貯金することもできないのにしてしまっているところ。■提出 #34171598 (WA×4 / TLE×10)。さっきの提出の修正版。BIT の添字の操作と同じように LSB を順番に取り出して、節約できる操作回数を正確に数えるようにした。WA が大幅に減って TLE が生じてるのはその結果。ではすべてが TLE になるのではなく依然として WA が4つあるのはなぜか。解を二分探索しているのだけど、MSB が異なる2つの解を比較したとき、ある要素 A にとって小さい方の解では無視されたビットが大きい方の解では操作回数の節約に利用できるという状況が起こりうる。判定に単調性がない。■……1時間経過。提出 #34178565 (TLE×1 / 5307 ms)。解の MSB が同じなら単調性があるわけなので高次のビットから 0/1 を決める方針。1ケースだけ 307 ms オーバーした。■終了後の提出 #34182184 (AC / 2052 ms)。判定が済んだ部分について入力のビットを折っておくことで時間の節約をした。そうすると決めて時間があれば書き換えはただの作業。■あわや緑落ちかというところまで下降しているレートにとっては1完でも +1 だったので、悪い日ではなかった。


2022年08月18日 (木) 初スマホ(20190518p01)から3年経つけど Android が使えていないという記録。スクリーンショットを撮った。削除するためにファイルアプリを開いたらファーストビューが「最近」で、そこにさっき撮った PNG 画像が見えている。選択しても選べるコマンドに削除がない。画像ビューに切り替えると Screenshots というそれらしいフォルダが見えるが、タップしてもチェックマークが付くだけで中が見えない。フォルダの操作がしたいわけではないし、フォルダを開く操作が選べるわけでもない。ビューを内部ストレージに切り替えて Pictures というそれっぽいフォルダの中を見るとここにも Screenshots フォルダが見えるが、またもチェックマークが付くだけで中が見えない。■いったいスクリーンショットはどこにあってどういう手順を踏めば削除できるのか。最近ビューで削除できないのは間違いなさそう。Screenshots フォルダを開いて中の画像がリストできたら選択して削除ができる。■自分が知らなかったのは、アイコンをタップするのとそれ以外の文字領域をタップするのは意味が違うということ。何度か同じ操作を繰り返していたんだけど、Pictures フォルダは何度でも開けて、Screenshots フォルダは一度も開けなかった。表示形式にリスト表示と並べて表示という違いがあり、それにより1項目の形状と占有面積が異なり、自分は大きさと形が異なる対象に対して異なる部位を、しかし決まった部位を触っていたために、何度繰り返しても探しているものに辿り着けなかった。【心得】フォルダを開くためにはフォルダアイコンをタップしたりどこでも長押ししたりするのではダメで、文字領域をタップしないといけない。【重要】あほくさ。


2022年08月16日 (火) [AtCoder] 復習。ABC258-E「Packing Potatoes」。20220720 に書いたようにこの手の問題は計4問解いてるけど、どれも ρ 型になる遷移グラフを明らかにする、めんどうくさくて間違えやすい方法で解いていた。今では LCA のためにダブリングを実装した経験もあることだし(20210617p01)、この手の問題でもダブリングを使ってみたいな、と。■提出 #34096860 (AC / 389 Byte / 1585 ms)。485 ms と比べるとかなり遅くなる。


2022年08月15日 (月) [AtCoder] 精進。AGC058-A「Make it Zigzag」(緑 diff)。■最初は長さ 2N のソート済み数列を前半後半に分けて交互にファスナー状に配置したらジグザグになるじゃないかと考えた。たとえば N=3 のとき、作る数列を 1,4,2,5,3,6 と決め打つということ。交換回数は転倒数でわかる。提出前に気がついたんだけど、解答に「以下の操作を 0 回以上 N 回以下行うことができます」という制約が付いていた。一応ね、実装前にざっと制約を探しはしていた。でも制約セクションには入力の制約は書いてあっても出力の制約は書かれていなかったのだな。転倒数の総和の最大値はたぶん入力となる数列が逆順にソートされている場合で、0 から 2N-1 の範囲の和(=N(2N-1))になるから、入力次第で操作回数が N を超える。■次に考えたのは、入力の先頭を出力の先頭にとりあえず配置して、次に配置する要素を、出力の末尾との比較によって入力の前の方から貪欲に引っぱってくる方法。考えなければいけないのは、出力の末尾より大きい(小さい)要素が入力の中に残っていないときにどうやってジグザグを維持するか。たとえば出力の末尾2要素が O1,O2 で入力の残りが I1,I2,I3 のときに大小関係が O1<O2<I1<I2<I3 だったら、O2 より小さい要素を入力から選んでジグザグを作ることができない。解決するのは簡単で、入力の先頭を出力の末尾の1つ手前に挿入すればジグザグになる。O1 との大小関係も大丈夫。I1 が O1 より小さいせいでジグザグが壊れるならそもそも苦労していない。この解法のネックも操作回数で、2N の入力のそれぞれに対して 0 回から複数回の操作が必要になる。ランダム入力では N=100000 に対して 180000 回くらいの操作が必要になった。■次に思いついたのは(考えたって書くのやめちゃった)、さっきの解法の例で出した O1,O2,I1,I2,I3 の中で、O2,I1,I2 の大小関係にだけ注目してジグザグが作れるんじゃないかということ。3つの大小関係がどうであれ0回か1回のスワップで山ないしは谷が作れる。(O2 がスワップ対象だけど)スワップによる既成出力への影響はどうか。スワップが必要なのは真ん中の要素が山なら極大値、谷なら極小値になっていなければいけないのにそうではなかったときだから、山を作るためにスワップされたどちらかの端の要素はそれまでより小さくなり、逆に谷を作るためのスワップでは端の要素が大きくなる。山になる要素の隣は谷になるべき要素だから、スワップで小さくなってもジグザグは維持される。谷を作る場合も同じ。■提出 #34071956 (AC / 331 Byte / 212 ms)。N 回のループの各回で1回以下のスワップだから交換回数も大丈夫。精進だからこそトントントンと AC までステップが踏めたんだろうなあ。2番目のトンがなければ AC につながる3歩目のトンはなかったし、次の一歩が出てこないことも2歩目があさっての方向に向いていることもよくあることなので、5割以上の確率で0完になる AGC はリスキーすぎる。緑だったときにレート変動対象から外れて以来不参加だよ。■■■B 問題「Adjacent Chmax」は小さい P から順番に DP かなと思ったけど、何を記録するのかが(実装を始めても)はっきりせず。


2022年08月11日 (木) Blasphemous を A エンドと B エンドでクリアした。3日で 20 時間くらい。エンジェル1人と遺骨1つだけ取り逃していて見つからず。C エンドの条件も満たしたんだけど、クリサンタを倒したあとだったために見られず。クリサンタさん声がとってもステキ。あとこのゲームは世界観がすごく良い。キリスト教的な罪と罰と拷問みたいなエグさ。死こそ福音なりか。■「【Blasphemous/ブラスフェマス】2D版ダークソウル降誕!美麗ドット絵で紡ぐダークファンタジーメトロイドヴァニア【真エンディングへの道】」「【ゆっくり実況】ブラスフェマス Cエンディング RTA 1:41:39 part1/5 - YouTube」 ブックマークしてるチャンネルでプレイしていたので知って買った。