/ 最近 .rdf 追記 設定 本棚

脳log[2022-04-27~]



2022年04月27日 (水) [AtCoder] 精進。先週あったモノグサプログラミングコンテスト2022(AtCoder Beginner Contest 249)-F「Ignore Operations」(青 diff)。コンテスト当日は同じ青 diff だけど F より難しいことになっている E 問題「RLE」で詰まっていた。E 問題は制約上限が 3000 なんだけど愚直にやると N の3乗になって TLE が避けられない。最内ループの足し上げる部分をなんとかしたかったけどどうにもならなかった。N<300 くらいまでしか間に合わない。■さておき F 問題。まずどの t=1 を無視しないかを決める。そうするとそれより前にある操作は存在しないのと同じ。それより後にある t=1 はすべて無視しなければいけない。後にある t=2 のうち 0<=y のものは当然無視せず(K を消費せず)最大値に寄与させる。後にある t=2 のうち y<0 のものは小さいものから無視できるだけ無視する。問題はこれをどう効率良く処理するか。特に負の y の累積和。ソート済みの状態を保ちながら y を順次追加しつつ、その累積和を利用したい。■提出 #31310696 (AC / 1130 Byte / 520 ms)。BIT を2本使ってがんばる。■そうだ思い出した。E 問題で詰まっていたのは本当だけど、D 問題を諦めて飛ばした上で詰まっていたのだった(つまり3完)。D 問題の制約上限 20 万にびびって手がつけられなかったのだけど、解説を読めば「さて、実は……」とか書いてある。それがわかんねーんだよな。10 数個だけ解けずに残っている選ばれし緑 diff の1つ「Coprime」の仲間だと思った(それなら解けない)。


2022年04月19日 (火) 今日の新発見。これまで同時に考えることがなかったので気がついていなかったけど、精通って2通りの意味がある! どうしよう使いにくい言葉になってしまったな。むりやり通暁しているとか言い替えても大げさすぎて自分で何事⁈って驚いちゃうもんな。


2022年04月18日 (月) 最近ちょいちょい耳にする戦争犯罪という言葉(概念)を自分は知らない。当たり前のように使われているけれど。戦争と付けることで、まあしゃあない部分もあるかもなと割り引いて考えればいいのか、言語道断絶対許すまじと処罰感情増し増しで受け止めればいいのか、そのどちらでもないのかよくわからないで聞いている。もうひとつ思いついたのは、犯罪行為を裁くのはウクライナかロシアか場所や人の当事国の役割だと思うけど、ロシアがロシア兵を裁くことに期待はできないから、戦争犯罪という扱いを既成事実化することで戦勝国が裁くんだぞという空気を醸成しているのかなと思うなどした。言葉と歴史を知らない。調べもしない。


2022年04月15日 (金) [AtCoder] 精進。全国統一プログラミング王決定戦予選-D「Restore the Tree」(水 diff)。子孫ノードへのショートカットが M 本追加された(元)木からショートカットを取り除く問題。ショートカット先が子孫ノードに限定されているのでそれほど複雑なグラフになるわけではない。たとえば根から始めて各ノードの深さを決めていくとする。ショートカットがあるので親が1つとは限らないわけで、異なる複数の深さが1つのノードに与えられそうになるけれど、常に最大の深さがそのノードの本来の深さで間違いない。深さを比べれば親がわかる。■しかし TLE。幅優先探索でも max-heap でも min-heap でも時間内に深さが決められない。■提出 #30984890 (AC / 267 ms) 一夜明けての AC。方針転換を決めてからは早かった。すべての親が到着するのを待ってから下方向への探索をキューに入れる。深さを決める問題が部分木ごとに独立した問題になるから問題ない。最後に到着した親が本当の親。うまく型にはまってくれない問題だった。解く側の印象はそうなんだけど、他の人の Ruby での解答をざっと見た印象では、自分のとやっていることがほぼ同じだった。親の数をデクリメントするあたりが特徴的。型にはまらないように見えて解答の型はがっちり決まっていた、ということ。


2022年04月13日 (水) クイズクイズ「競技プログラミング用語の略さないやつ | クイズメーカー - こたえてあそぶ・つくってあそぶ・クイズのプラットフォームサービス」。■結果。「競技プログラミング用語の略さないやつ 10問中 7問 正解しました! 【 ①○ ②✕ ③○ ④✕ ⑤○ ⑥○ ⑦○ ⑧○ ⑨○ ⑩✕ 】」■間違えたの。「LCM」Multiplier だと思ってた。言われれば掛けるものではなく掛けた結果ではある。Multiple(倍数)だって。「BFS」パンのような息のような読めない奴としか覚えていない。ちなみに Width もワイズのようなウィズのような読めない奴という認識にとどまっている。「LCA」Least だと思ったら Lowest だった。日本語だと最小~が多くて最近~もあるかな、という雰囲気。日本語ファーストで(いかたこさんのところで)覚えた概念だから Lowest より Least を選んでしまった。実際のところ Lowest も Least も最小もしっくりこないせいでこれまで何度も L が何の略だったか頭を悩ませてきていて、LCA は LCA であるということでもう済ませてしまっている。他人と共有しないのなら概念は概念のままでラベルだって本当はいらない。でも思い出すきっかけとしてラベルが有用なことはある。LCS と区別するために Ancestor だけわかれば十分。余談。LCS の S は Sequence の S ではないのだ。■正解したの。GCD、DFS、DAG、DP、BIT、DSU、SCC。


2022年04月02日 (土) Excel 2007 日記 (前回>20220324)。テーブルと名前付き範囲の関係。テーブルとオートコレクトの関係。「Excelでテーブルに数式をセットする際の注意点 | ∞ワークス」 ならばテーブルとは?■テーブルの列にサブクエリの結果を付け加えたい。たとえばキーと日付のペアが記録されているテーブルがあったとして、キーを追加したときにキーに対応する前回の日付を表示する第3の列を用意したい。このテーブルは待ち行列なのであって、適切なインターバルを空けるために前回の日付を参照してフィルタリングするために、同じテーブルを参照する再帰的なサブクエリを発行して列を付け加えたい。VLOOKUP では最初に見つかった行の値になる。DMAX では CRITERIA 引数部分に構造化参照が使えると書いていない。集計表としてピボットテーブルを作成しておいて VLOOKUP でピックアップしようとした。「ピボットテーブルとVLOOKUP関数を組み合わせて使う【Excelの応用】 | Howpon[ハウポン]」ピボットテーブル名ってテーブル名と互換性があるような見た目をしてるけど管理された名前付き範囲ではないのね。シート名とセルの絶対参照を検索範囲にして VLOOKUP しないといけない。実は日付だけでなく文字列フィールドも集計の対象のひとつなのであって何か書いてあれば駄目フラグとして扱うつもりなのだけど、ピボットテーブルの集計関数(最大値)は最初に数値化してしまうらしく文字列ではなく 0 が集計されるのだった。ピボットテーブルは名前の扱いも集計関数も不都合なので結局 Microsoft Query を通して集計表を作成しておくことにした。SQL を直接編集すれば GROUP BY も MAX 関数も使えるし、文字列フィールドの最大値はきちんと文字列が返ってきた。この SQL はデータソースが解釈、実行するらしいのだけど、ソースが TSV ファイルや Excel ブックの場合は Microsoft {Text|Excel} Driver が実行しているのかどうか。フォーマットに関する情報しかない。「Text File Format (Text File Driver) - Open Database Connectivity (ODBC) | Microsoft Docs」■どんどん深みにはまっている感覚がある。何がいけないって、まずフォントや色や文字の配置といった時間が余ったときの仕上げ行程にふさわしい操作がありとあらゆる機会に目に入り目当ての操作を隠し答えのない脇道へと誘惑する。次に自由度の高さ。制約が乏しくありとあらゆる部分でアドホックに手を入れてデータや構造を壊せてしまう。そんな方眼紙や自由帳のような自由はいらない。■複合グラフ。新しいバージョンでのような導線がないだけであって Excel 2007 でも作れる。「Excel 2007 / 2010 / 2013 / 2016 で複合グラフを作る|クリエアナブキのちょこテク」 データ系列の書式設定を自力で見つけることはできなかったよ。■GetPivotData 関数の存在に気がついた(オプション項目で目にしていたけど関数名だと思わなかった)。列番号ではなく列の名前と値を使って目当てのセルを特定できるのが特長なのかな。セルを特定するのに行と列の2次元とは限らないところが難しい。基本的には総計が返る。フィールド名と値のペアを引数に追加するごとにより限定された小計が返る、という感じ。要するにこうだ。最初に集計項目を選び、追加のパラメータでいくつか属性を絞り、積集合部分の集計値が返る。このクエリに高速に答えられるのがいわゆる Wavelet ~ というデータ構造なのだろうか。クエリごとにインデックスを用意するならデータベースでおなじみだという BTree でいいんだろうけど、Excel はクエリがプログラマブルだから予め個々のインデックスを用意しておけないと思う。専用の関数だけど名前で対象のピボットテーブルが特定できるわけではないらしくやっぱり番地で参照しないといけない。しかし目当ての集計値を特定するのには番地を必要とせずピボットテーブルの表示状態に左右されないところが GetPivotData が必要とされた理由なのかな。■INDIRECT 関数がおもしろそう(どんな悪さができるかという意味で)。eval です。■複数のセルの値を条件にして VLOOKUP する方法。検索していくつか見つかったページはどれもセルの内容を連結した検索用の列を追加する方法だった。予想はしてた。■複数セルに一括入力。選択、入力して Ctrl+Enter。■予めソートしておくから VLOOKUP に二分探索で完全一致検索をしてほしい。TRUE(lower_bound)/FALSE(線形探索) の二択では足りない。■Microsoft Query はテーブルを認識していない? オプションでテーブルとシステムテーブルの両方ともにチェックを入れるとシートやクエリの名前が出てくるけどテーブル名は含まれていない。あと外部プログラムだからブックを保存しないとクエリ結果が古いブックに基づいたものになってしまう。やっぱり新しい Excel で Power Query が使いたいんだよなあ。「LOOKUP の結果を表として扱いたい。俺が書きたいのは SQL の SELECT 文だ。特定のセルを左上の頂点とする複数行複数列の範囲に収まるように、クエリ結果を上書きまたは下に押し出し挿入または右に押し出し挿入したい」と書いていたものもスピル(覆水盆に返らずの Spill)がそれっぽいらしいし。■最初は VLOOKUP が良さそうに見えてもいずれ必ず INDEX+MATCH に置き換えられる運命。検索キーより右側にある列の値しか拾えないとか、降順のデータから効率良く検索できないとかの、VLOOKUP の制約が表データと適合しなくなったらそうする他ない。


2022年04月01日 (金) [AtCoder] 精進。ABC100-D「Patisserie ABC」(水 diff)。一晩寝かせたら解けた(寝る前には解けなかった)。最初は8通り3ステップの解法を考えていた。つまり、3つある軸ごとに正の方向に最大化するか負の方向に最大化するかの組み合わせが8通り。3軸を順番に最大化するのに3ステップ。これだと3分の1くらいのケースで間違える。最大化するより他の軸とのあいだでうまく折り合いを付けた方が総合的に得する場合が漏れたのだろう。前後のステップを通して2軸のバランスはとれていたはずだけど、3軸の総合バランスが考慮できない。■提出 #30611715 (AC / 229 Byte / 68 ms)。3軸をまとめて8通り1ステップの解法で AC。肝心の5行目がちょっと冗長。x.zip(y,z).map(&:sum).max(M).sum でいい。


2022年03月29日 (火) [AtCoder] 精進。前回の ABC245-G「Foreign Friends」(黄 diff)。AtCoder Live の解説放送を初めて見たんです。「多始点ダイクストラ法でやる」「同じグループの場合を除外する」「トップ2を記録する」まで教えてもらうと解けそうな気がしました。要素技術は持っていたのに道が入り組んでいてゴールが見通せなかった感じ。たとえばトップ2を記録する戦略は「Bracket Sequencing」への提出 #17712418 で採用したことがある(_l 型のベストな要素と r_ 型のベストな要素が同一の要素だったときにベスト-ベストの組み合わせが作れないので、ベスト-2番、2番-ベストを次善の選択肢として用意しておいた)。■提出 #30555571 (AC / 1230 Byte / 1087 ms)


2022年03月26日 (土) [AtCoder] 今日は ABC245 があった。なんか変な回だった。自分のすべての提出。AC までの時間が……A=4分半、B=2分、C=6分半、D=未提出、D+E=1時間8分、F=9分。D 問題解きたかったなあ。知ってる問題を早く解くのが能じゃないんだよ。■D 問題解けたよー。提出 #30487945 (AC / 183 Byte / 64 ms)。行列を使わないと決めて考えれば特に難しくはなかった。なんかそれっぽい雰囲気に惑わされて慣れないことをしようとしていたのだった。最高次の係数から確定していく。確定した係数の影響を書き込んでいくことでより低次の係数を確定する準備とする。変数が M+1 個なのに対して方程式が N+M+1 個あって式が N 個余る気がするのに戸惑うんだけど、そこは An 以外の A は 0 になることがあるので勘定に入れてはいけないとかそういうこと?


2022年03月24日 (木) Excel 日記(前回>20220314)。Microsoft Query なら Excel 2007 でも使えるし、TSV ファイルをインポートした結果の範囲データが含まれるシートをテーブルとして抽出することもできる。できたのだけど、更新に問題があった。■背景。TSV ファイルと接続していて更新ボタンを押すことで最新の内容がインポートされるシートがまずあって、同じブックの別のシートへ Microsoft Query を通してそのシートの内容をテーブルとして取り込もうとしている。回りくどいことに同じブックのシート(最新の TSV を反映する範囲データ)からシート(テーブルデータ)へデータを変換するために Microsoft Query を経由している。最近の Excel で使えるらしいリンクテーブルや[データの取得と変換]機能が使えないことと、TSV との接続を保ったまま範囲データをテーブル化できないことからとりあえずこうなっている。■Microsoft Query を使って同じブックの別のシートの範囲データをテーブルとして取得することはできた。しかし更新しようとするとブックの形式が無効だとかそんなエラーが出て更新ができない。そのブックってエラーを出しているあなた(Excel)が作成した(そして今開いている)ブックなんですよ。それともエラーを出しているのは Microsoft Query なのか。でも最初の取得はできたんだよ。Excel が Microsoft Query をうまく操縦できていないのではないか。排他制御とかが関係してるんか。■自動更新テーブルが利用できないなら Excel のバージョンを新しいものに限るのもやむなし。更新(行の拡張)にしろテーブルの結合(列の拡張)にしろ、手作業でちまちまやりたくねーもんな。どっちも機械にやらせたい。範囲データからピボットテーブルを作成したとして、後から追加されたレコードは範囲外になるからピボットテーブルを更新しても反映されないらしいのだ。テーブル化してあるとそういう落とし穴がないらしいので、自動更新もテーブル化も必須。■これなのかなあ。「ODBC接続設定画面のようなものが出ます。ここにExcel Filesというものがあるのですが、これは旧形式のxls形式しか使えないので、ここでは新規データソースを選び、OKを押します。 データソースの名前は適当に。対応するドライバーの選択では、Microsoft Excel Driverでxlsxやxlsmを使えるものを選択します。」 でも Excel Files を選んだあとのファイル選択ダイアログの拡張子フィルタは *.xls* になっていて、信じるなら *.xlsx は対象に含まれる。そして実際にテーブルを抽出できていた。でもまあ他の方法を試してもいいだろう。■TSV の元データは COBOL のデータベースから変換した SQLite3 データベースなので(2017031520170807)、TSV を経由しないで SQLite ODBC Driver を使うことも考えてる。でもあんまりたくさんのバイナリファイルに依存したくないお気持ち。■翌日@2022-03-25 その他のデータソースで *.xlsx に対応した Microsoft Excel Driver を選ぶことで抽出から更新まで普通にできたわね。こうなると欲が出てきて、*.csv に対応した Text Driver を使うことで TSV ファイルを直接テーブルとして取得したくなるんだけど、ファイルの場所としてローカルドライブとネットワークドライブしか選ばせてくれない。コンピュータ名を使いたい。管理ツールに「データ ソース (ODBC)」という項目を見つけたのだけど、何か使えるだろうか。■Microsoft Text Driver はたぶん「ANSI」と「Unicode」にしか対応していない。UTF-8 だとエラーメッセージを出して読んでくれない。今以て Excel 自身が UTF-8 な TSV/CSV ファイルを開けないことに驚かされるくらいなのでまあ(メモ帳にも劣るんだよなあ)。Word は差し込み印刷のためのソースとして TSV/CSV を選んだときにコードページ一覧から選ばせてくれるから UTF-8 でも大丈夫(えらい)。


2022年03月23日 (水) [AtCoder] 精進。大和証券プログラミングコンテスト2021(AtCoder Regular Contest 128)-C「Max Dot」(青 diff)。「茶 diff も緑 diff も解けないゼロ完だった」回の ARC。今もって A 問題も B 問題も解けないんだけど C 問題はなんとかなった。だけど難しい。■もっとも単純なケースとして A 数列が昇順に並んでいる場合を考える。この場合は A 数列を後ろから見ていって、合計が S を超えない範囲で順番に上限である M の重みを割り振っていけば最大値が達成できるし、前から見ていったときに重みが減少していてはいけないという条件も満足できる。次に1つだけイレギュラーを起こして、A 数列のある要素が直前の要素より小さくなった場合を考える(ある要素を除けば全体として昇順になっている)。ある小さな要素と直前の要素をその平均で置き換えたときに数列の全体が昇順になるのなら、最初の場合と同じようにして最大値が達成できる。平均を取った2つの要素に揃って M の重みを割り振るにはもちろん S から 2M 分の割り当てを確保しなければいけない。これらを踏まえて実際に行う操作は、数列を後ろから見ていって基本的には平均を取る。現在の要素とこれまでの平均を比べて昇順になっている(現在の要素の方が小さい)なら平均を取るのを区切って新たな平均を取り始める。そして先頭まで処理が済んだら昇順になった区間に後ろから重みを割り振っていく。■提出 #30369066 (AC / 64 ms)。自分は1回の操作で満足していたのだけどテストケースが合わなかったので数列が完全に昇順になるまで何度でも操作を繰り返すようにしたらなぜか時間内に答えが出た。考えれば1回の操作で数列の長さは必ず1以上縮むのだから、最悪 N の2乗を想定しておけば答えは出るのだった。64 ms は 5000 の2乗よりずっと速いので何かが見えていない可能性はあるが。■これを「やるだけ」とか言って解きたいものだ。■自分のは ixrs さんのこの提出 #26597419 (AC / 61 ms) の劣化版みたいなものだな。自分が前半のループで if ~ else ~ end と書いているところがあちらでは until groups.empty? do ~ end になっていて、新しい配列を伸ばす一方ではなく処理対象にしてしまっている。そのおかげで一度のスキャンで必要な処理を終えられているのだろう。自分のように何度も何度もスキャンしないで済んでいる。それ以外の部分は全体的によく似ていて理解がしやすいあたり、O(N) 解法までわりと惜しいところまでいっていたのだな。解説に書いてあった O(N) 解法のヒント(凸包)が何のことかはさっぱりわかりませんが(「俺は凸包の点数はいらねーんだ」「それは自分の人生とは一切関わることのない専門用語」)。■まねまね>提出 #30381972 (AC / 66 ms)。


2022年03月16日 (水) [AtCoder] 精進。ABC076-D「AtCoder Express」(青 diff)。どう解くのが王道かわからない。ABC004-D「マーブル」の解法(20210406p01)を下敷きにしてシミュレーションで解いた。行き当たりばったりで区間の端の速度を書き換えて影響を波及させる感じ。マーブルは3要素だったけど今度は最大で 100 要素あるので、メッセージのやりとりが錯綜すると怖いなと思いながら祈って出した。■提出 #30174747 (AC / 1109 Byte / 62 ms)。全然問題なかった。グラフがとてもわかりやすい解説記事「ABC 076 [いかたこのたこつぼ]」。左からと右からの2回のスキャンで済むらしいところが自分のは N の2乗になってる気がするけど、制約が緩くて助かっている。今だと間違いなく 50 万くらいの制約上限で出てくるよね。■express という語のイメージはなかなか掴みづらい。意見を述べる、感情を表現する、急行、速達、追越し車線(~lane)とか書いてある。Visual Studio の無料版が Express Edition だったりもした。ここで Express Edition と急行のあいだに共通点が見つかった。IDE では機能の一部が、急行では停車駅が、間引かれている。だから?という感じではある。Express Edition を理解する助けにはなったけど express の語が掴めたとはいえない。母乳を express するという用法もあるみたい。ある意味これは意見や感情の表出と同じように ex + press で理解しやすい。■話は戻って AtCoder Express. N の2乗を改善する方法がたぶんあって、区間の左右端の初期値をゼロではなく上限(v)にすれば良かった。それから先頭と末尾に幅と上限を 0 にしたダミー区間(Span.new(0,0))を配置する。提出 #30372922 (AC / 64 ms)。実際これで Span#accl_lSpan#accl_r の呼び出しが減るんだけど、ケースが弱くて差が出ないどころか遅くなったように見える。■いや、初期値は不定(nil)にして、一端が不定のあいだは他端に隣接する区間から打診されるどんな速度も(上限に関わらず)受け入れるようにしないと N の2乗は改善しない気がするな。


2022年03月15日 (火) [AtCoder] 精進。エイシング プログラミング コンテスト 2019-D「Nearest Card Game」(青 diff)。難しくはないと思うんだけど、非常にややこしい。頭の中でシミュレートしてみると数列が前部と後部の2つの部分に分けられることがわかる。後部は必ず偶数個あるようにしてさらに前半と後半に分ける。後部の後半は高橋くんが取り、後部の前半は青木くんが取る。前部は大きい方から高橋くんと青木くんが交互に取る。制約が厳しくて毎回シミュレートはできないのでソートした X に沿って尺取りをする。■提出 #30154854 (AC / 459 Byte / 228 ms)。X をソートすることも累積和も尺取りも特別なことではない。だけどサンプルを合わせるのに何時間もかかった。