/ 最近 .rdf 追記 設定 本棚

脳log[2022-03]



2022年03月06日 (日) [AtCoder] 精進。昨日あった ABC242-F「Black and White Rooks」(黄 diff)。求めるものは読めばすぐわかる。盤面の行と列を白と黒(と中立)で分け合う場合の数。ただ、白でも黒でもいいのだけど、片方の色が何行何列を占めている場合の数が求めにくい。テキトーに配置すると想定より少ない行、少ない列の範囲内に収まってしまう。本城裕二。参考問題を知っている。ABC003-D「AtCoder社の冬」(黄 diff)。これを4か月前に解いていた>20211222。求める場合の数が一筋縄で求まらないことがわかったなら、DP で漸進的に求めていく方針も立てやすい。■提出 #29926956 (AC / 537 Byte / 715 ms)。けっこう制約が優しくて、ループ内で愚直にスキャンして掛けて足し合わせても間に合いそうではある。一応簡単にまとめられる掛け算はまとめたけども。見直していたらまとめ忘れてるところを見つけたけども。□他の提出を見て書くのだけど、ぼかしても Ruby に限るとそれは1つしか存在しないのだけど、DP を白と黒の2回やると TLE になるみたい。1回でいい理由は、白か黒の片方がきっちり X 行 Y 列を占めている場合の数が求まったなら、他方の色は N-X 行、M-Y 列の範囲にテキトーに散らしていいので、それはただのコンビネーション1つで求まる。□あと実は同じ DP だと思っていたのだけど式が違っていた。自分は包除原理の足したり引いたりを理解していないので、ある色を X 行 Y 列にテキトーに配置する場合の数から、X 未満の行、Y 未満の列に収まってしまう場合の数を引いて、X 行 Y 列をきっちり占める場合の数としている。X と Y を徐々に増やして過去の計算結果を再利用しながら求めている。解説を読んだらこちらが DP としてあちらが包除原理として両方ともが紹介されていた。■ところで昨日の結果は? 自分のすべての提出。終了3分前に D 問題に滑り込み AC して4完最遅パフォでレートは微減。4完だけど6問解けたのでヨシ! 前々回も似たようなことを……「3完だけど5問解けたのでヨシ!」 ABC242 は D 問題と E 問題が脳みそを絞られるような「きっつい」問題で(3回口に出た)、F 問題だけがとっても ABC らしい問題だった。D と E みたいなのは出し惜しみして ARC にまわしてくれると、ゼロ完が回避できて喜びますよ。ABC に出ても嬉しくない。


2022年03月13日 (日) [AtCoder] 昨日あった ABC243。特に書くことはないかな。E 問題までノータイムで実装に取りかかれたけど結果は ABCD の4完。E 問題は? 300 の3乗のワーシャルフロイド法が無しだと思って迷走して TLE で終わってしまった。■E 問題>提出 #30084536 (AC / 1281 ms)。辺のコストが2点間距離より大きい場合と、等しいけど代替経路がある場合に取り除ける。代替経路は中継地点の存在によって見つかる。あとから中継地点を探索しても計算量は変わらないけど、ワーシャルフロイド法のついでにメモしておくとちょっとは速いかな、と思いました。その他にはスタート地点までの距離を 0 にしないで初期値のままにしておくと中継地点の探索が楽になるとか(中継地点が端点のどちらかと一致する場合を除外しないで済む)、初期値を無限大ではなく nil にしておいて nil を検出したらループをさっさと抜けるとか、そういう小手先 Tips。実装量からいっても水 diff 下位だと思ったけどギリギリ青 diff だったもよう。意外。■次のステップはこういう回で F 問題に時間を残して通せないと来ないんだよ。今回の F 問題は解答の提出フォーマットがすでに謎なんだけども。■■■E 問題。「Numo::NArray でワーシャル–フロイド法の多重ループを記述削減 - Qiita」■E 問題の考察がノータイムだったのって 第七回 PAST の K 問題「急ぎ旅」を解いていたからかもしれない>20210721p01.11。最短経路はどの2点間を取り出しても最短だし、最短経路同士はどの2本も分岐と合流を繰り返しながら平行して走っているってやつ。


2022年03月14日 (月) 続いている Excel 日記 (202003252021112020220211)。Excel でできなかったこと。シートと TSV ファイルを結びつけて1ボタンで最新の TSV がシートに反映されるようになっている(自動更新は気に入らない)。この時点ではただの「範囲」であるシートをテーブル化して便利に使いたいのだけど、テーブル化すると TSV との接続を削除されてしまう。二者択一。テーブル機能っていうのは静的な、死んだデータに対してしか利用できない機能なのか。薄々察しつつあるのだけど、Excel の花形は方眼紙や注釈や色分けなどのプレゼンテーション方面(どうでもいい!)であって、お賢い機能はまだ見ぬ Access にこそあるのか。目の前にあるのより新しい Excel にはリンクテーブルという名前の機能があると知って、やっぱりできるはずだよねーと思ったし、「[テキスト ファイル ウィザード] が見つからない / 起動できないとき|クリエアナブキのちょこテク」という記事を読むとテキストファイルウィザードに代わる新しい「テキスト または CSV から」というコマンドにも見込みがありそうなんだけど(旧機能が単発のインポート機能であるのに対して新機能は継続的な接続機能であるように見える)、Excel くんよ、進化の方向は正しいと思うんだけど、君はまだ発展途上だったのかい。2000 年あたりにはもう完成していたぐらいの期待を持っていたのだけど。■次なるキーワード「Microsoft Query」「ODBC」。Excel のバージョンが古いからキーワードも古めかしい、といって以前から知っていたわけではなくてこれから試すんだけど。


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


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