/ 最近 .rdf 追記 設定 本棚

脳log[2022-06-13~]



2022年06月13日 (月) [AtCoder] 精進。ABC136-E「Max GCD」(ギリギリ青 diff)。操作によって A の総和に変化がないので、A の総和の約数が答えの候補。飛び飛びに存在する GCD の倍数に A 数列の各要素を寄せていくイメージ。操作回数に制限がないなら総和そのものが答え。1は常に可能な答え。それ以外の答えを約数の大きい順にテストしていく。■提出 #32461534 (AC / 448 Byte / 131 ms)。判定関数が全然わからなかった。足す数と引く数の釣り合いが必ず取れることは決まっているのだけど、釣り合いが取れるまでの操作回数がわからなかった。Array#insert を繰り返す効率の悪い方法で数えている。


2022年06月12日 (日) [AtCoder] 精進。昨日あった ABC255-E「Lucky Numbers」(水 diff)。S を引き算すると A 数列の奇数項の階差数列と偶数項の階差数列が得られる。つまり、最大 10 個のラッキーナンバーに A 数列を当てはめるにあたり、操作できるパラメータは2つ……ではなくて、S1 = A1+A2 であるから奇数項と偶数項のあいだにも拘束条件があって、実質的にパラメータは1つ。1 WA したあとでそのことに気がついたけど、時間内に完成させられなかった。じっくり時間をかけても WA だったから、取りこぼした5完を悔しがることもできない。今日の提出 #32437476 で AC (3380 ms)。d2 の正しい定義がさっぱり見つけられなかったのが敗因。■Ruby でのすべての提出を見ると一番速いのが 363 ms。3秒オーバーは甘えだということがわかる。AC するのがやっとでさっぱりわからない。


2022年06月10日 (金) [AtCoder] 精進。CODE FESTIVAL 2015 予選A-D「壊れた電車」(青 diff)。■N の制約上限が1ギガだと気付かずに長さ N の配列を埋める解法をまず考えた。左端の人から順番にカバーする範囲(左隣の人から右隣の人まで)の配列に所要時間を埋めていく。隣り合った3人の整備士について考える。真ん中の人が最も右まで(右隣の人の直前まで)カバーするとき、左側をカバーするのに最も時間がかかる。左隣の人に右側をカバーしてもらうのにかかる時間と真ん中の人が左側をカバーするのにかかる時間がバランスするのはどこだろうか。真ん中の人が右側でカバーする範囲を1つ減らすと、左の人と真ん中の人がバランスする時間はどう改善するだろうか。右の範囲をさらに1つ減らすと……。■提出 #32342207 (80/100 点 / 355 Byte)。最も右の人が配列の N 番目を埋める時間が答え。■制約を考慮すれば N についてではなく M について処理を進めなければいけない。使える時間が与えられたとき、M 人の人は N 台の車両を左から順番にそれぞれどこまで修理することができるだろうか。■提出 #32342450 (100/100 点 / 149 Byte)。満点解法の方が短くて書くのが簡単なんだよなあ。自分はややこしい 80 点解法を完成させたことを評価したい。みんながみんな判で押したように解説通りの満点解法じゃ面白くないでしょ。迷えるのは見えていない者の特権!(迷いたいわけではない)


2022年06月09日 (木) [AtCoder] 精進。ABC116-D「Various Sushi」(ギリギリ青 diff)。K 個の総和を大きくしたいけど種類ボーナスがあるせいで若干の番狂わせがあるのをどうするか。とりあえず種類を気にせず大きいものから K 個取る。K 個で K 種類あるならそれまで。種類数が少ないなら、N-K 個の余りからおいしさが大きい順に、種類数が増える限りにおいて、入れ替えてスコアを再計算してみる。入れるもの出すものの選択は貪欲法でいい。■提出 #32335682 (AC / 338 Byte / 238 ms)。二分探索かなとか種類数を固定して考えるのかなとか、種類数を決めても種類の取捨選択で試行錯誤ができないのをどうするかなとか、わりと考えた。考えた結果が「(種類数を増やすにあたり)入れるもの出すものの選択は貪欲法でいい」。■ブログを読んでいると、種類数「の最低ライン」を決めてそれを満たすように X 種類 X 個を選んだあとで、残り K-X 個を無差別に選ぶのでも良かったらしい。種類数を固定するのではなく、種類数の最低ラインを固定する。ただ、こちらは効率的な実装が難しい気がするな。ソート列を2本持って、1本目から X 個取ったあとで、両方から K-X 個を取るような……。あ、Ruby で最速 207 ms の提出 #5420937 における strongyowai_sushi ってそういうことか(2本のソート列)。そして、その提出によれば2本のソート列から K-X 個を取るパートはない。1本目のソート列から X 個を超えて取る方が良くなるケースは、X を増加させた後のループで試行されるのを待てばいいのだから、それはそう。そしてだからこそ、40 行目 tmp = intstrong[t] + intyowai[k - t] + t*t において K 個の実際の種類数が t 種類より多くてスコア計算が不正確であっても(不当に低くても)無視して良い。難しいなこれ。ある時点のループにおいてベストを求めなくていいし不正確でもいいということを見極めて受け入れるのは。


2022年06月01日 (水) [AtCoder] 精進。ABC131-E「Friendships」(水 diff)。苦しんでいた時間の半分以上で木を構築しようとしていた。そうではなく、自己辺と多重辺がないグラフでいい。つい先日(20220526)「Tr/ee」を解くのにキャタピラ木を構築していたのに引きずられている。最短距離が2の頂点ペアが最も少なくなるのが直線状の木で、最も多くなるのが星型の木なんだけど、木は条件じゃあなかった。(木に限らない)グラフが構築できる上限は星型の木と同じだったけど、下限はゼロであり存在しなかった。■提出 #32150851 (AC / 522 Byte)。根本的な軌道修正はできなかった。当初の方針通り三角数と K の値を見比べて星型と直線状のバランスを取りながら頂点を1つずつくっつけていった。「Tr/ee」を解いたのと同じ方針。judge.rb27 を書いたのも同じ。■「Ruby でのすべての提出」を見ると一番短いのがこちら>提出 #6356157 (193 Byte)。すごく単純な二重ループ。■この問題は完全グラフをスタート地点にするのがわかりやすい。全頂点間の距離が1の状態をスタートにする。ここで A-B 間を直接つなぐ辺を取り除くと A-B 間の最短距離がどうなるか。ほぼ完全グラフなのであらゆる経路あらゆる距離が考えられるけど、距離1だけが実現できない。という感じで、グラフが連結を保つための最低限の辺を残すことに注意しながら、任意の2頂点間を結ぶ辺を K 本取り除けば答えが出る。■提出 #32158282 (AC / 234 Byte)。思いついてから実装完了まで 10 分 15 分でバグも無し。昨日4時間以上苦しんでいたのはなんだったのか。■「という感じで」とか書いて雰囲気で流してしまったけど、星型のハブになる頂点を選びそこに繋がる辺を残すようにうまいこと辺を取り除かないと最短距離2が保証できなくなるっぽい。さっきの提出が AC になったのは頂点ペアの持ち方、取り除き方の2つの偶然が重なった結果なのかも。参考「競プロ参戦記 #53 Friendships | ABC 131 - Qiita


2022年05月29日 (日) [AtCoder] 精進。昨日あった NOMURA プログラミングコンテスト2022(AtCoder Beginner Contest 253)-E,F。E と F が精進の対象だということは4完だったということ。無念なり。現実を直視できなくて結果を見ないまま今日の ARC141 に出たからね。そこで +2 だけ元気をもらって復習にとりかかりました。■E 問題「Distance Sequence」(緑 diff)。とくになんということのない DP のはずだったんだけど、最初の提出 #32032452 が TLE になった。このあと 55 分間迷路に迷い込んでいるうちにコンテストが終了していた。□今日の提出 #32096311 (AC / 727 ms)。ちょこちょこ整理した部分はあるけど本質的な差異は sksk%P かという違い。余りをとるコストをケチってかえって Bignum のコストを支払って TLE になっていたのだった。あほ。■F 問題「Operations on a Matrix」(青 diff)。昨日は問題を読みもしなかった。やることは明らかだけどどう効率的に実装するかという問題。□最初の提出 #32096736 は TLE/MLE になった。長さ 20 万になりうる配列を最大 20 万回複製しようとしていたのだから、40 ギガを数倍したコストが予期される。TLE/MLE も当然。□次の提出 #32097180 で AC。クエリ先読みで必要な値だけ覚えるようにした。典型です。最近では ABC202-E「Count Descendants」を解くときに同じことをした>TLEAC。E 問題を AC してから 50 分だから、%P%P とタイプするだけの手間で E 問題を AC に持って行けていれば6完もありだった。幸せな皮算用。


2022年05月26日 (木) [AtCoder] 精進。ARC103-E「Tr/ee」(青 diff)。まず不可能なケースを考えた。木なので必ず葉があり、葉に繋がる辺を切れば必ず大きさ1の連結成分ができる。S1 が 1 でなければ不可。サンプルにあるように「n 頂点の木から辺を 1 つ取り除いてサイズ n の連結成分を作ることはできません」ので、Sn が 1 の場合も不可。他には、木において辺とは頂点集合を左右2つの連結成分に分けるものなので、Si と Sn-i が食い違う場合も不可。ここから答えの構築を考えた。大きさ1の連結成分から始めて1つずつ大きくして N/2 までの連結成分を作る。N/2 より大きい連結成分は大きさ N/2 以下の連結成分の片割れとして自動的にできあがっているので考えない。Si が 1 の場合、直線状に伸ばすことで大きさ i の連結成分が生じるようにする。Si = 0 の場合、葉を生やして横に大きくすることで大きさ i の連結成分が生じないようにする。最後に余った頂点をすべて葉としてくっつけて始末する。■提出 #31963209 (AC / 403 Byte / 131 ms)。以前に解こうとしたときは、大きさごとに連結成分を分けてプールして、小さい連結成分を組み合わせることでより大きい連結成分をプールするような処理を考えていた。実はプールする連結成分が1つだけでいいことと、大きさ1の連結成分(葉)がすごく便利に使えることに気がついたので今日は解けた。■コメントアウトしてある部分は、解答と入力に矛盾がないことを確かめるために、解答から入力と同形式の文字列を作って比較している。そのために judge.rb27 を書いた。■ブログを読んでいたら、解答のような木には「キャタピラ木 (Caterpillar tree)」という名前がついているらしい。わざわざ名前を付けて区別して嬉しい理由があるのでしょうね(調べない)。


2022年05月23日 (月) [AtCoder] 精進。ARC045-C「エックスオア多橋君」(ギリギリ黄 diff)。一読して全方位(?)木 DP だと思った。提出 #31922668 (AC / 555 Byte / 626 ms)。20211014 で解いた第八回 PAST の H 問題「最短経路」と同じ解答の形。■Ruby での提出一覧を見ると一番速いのが 392 ms のこちら>提出 #2757184。仮に頂点 1 に値 0 を割り振って、その他の頂点の値が何になるかを求めている。それから XOR が X になる値の組を数えている。頂点 1 からのパスによって決まる値だけを考えて答えを出していい理由は、たぶん LCA までのパスが相殺されるからとか? 最後から2行目の ans -= N if X == 0 がはまりやすい罠に見える。X がゼロの時、同一頂点をペアにして数えてしまうのを除外している。もしやと思って直前の WA 提出 #2757181 を調べてみるとこれが抜けていたのが原因だった。WA から3分半で気がつくかあ。無理だよ。他に Ruby で解いている人はゴルファーが一人いるだけ。古い問題なのもあるだろうけど、一見して面倒くさく見えるのも影響してそう。■ブログ記事を7つ読んだけどどれも LCA で相殺を利用していた。考える前に手を動かしている脳筋はいないのか、脳筋は。


2022年05月22日 (日) [BOOX Max2] 20220107 に書いたときからさらに劣化してバッテリーの寿命が尽きていることが間違いのない Max2。ケーブルを繋ぎっぱなしで使えばいいのだけど、家の外に持ち出さないにしても案外に煩わしい。Max2 対応をうたうバッテリー交換キットが売っていたので博打のつもりで交換してみた。さてどうなるか(充電中)。発火さえしなければいいよ。■■■完・全・復・活!


2022年05月20日 (金) 入力中の個人情報が“送信ボタンを押す前に”収集されている問題 約10万のWebサイトを調査:Innovative Tech - ITmedia NEWS」■こういうことがあり得ると思ったから、毎月自動振替で利用しているサービスのログイン画面にキャプチャ(CAPTCHA)のための外部スクリプトが埋め込まれたときに、ログインできなくなった、そのドメインを信頼してスクリプトの実行を許可してもいいかと問い合わせたよね。めんどくせー奴。最初は良くてもあとからこのように(「2020年7月にサービスを終了しましたアクセスログ解析サービス Visionalist においてログ収集システムとして利用しておりました“tracer.jp”ドメインを、当社が廃止した後、第三者がドメイン管理会社から取得し、セキュリティ上問題があるスクリプトを設置している可能性があることが判明しております。」)、ドメインの所有者が変わって(変わらなくても)中身が変わることがあるわけなので、接続しているサイトと異なるドメインから送られてくるスクリプトは基本的にブロックするよね。tracer.jp ドメインがその例だし、今でも facebook.com とか google-analytics.com から送られてくるのとか必ず。めんどくせー奴。


2022年05月18日 (水) [AtCoder] 精進。パナソニックグループプログラミングコンテスト2022(AtCoder Beginner Contest 251)-G「Intersection of Polygons」(ギリギリ橙 diff)。答えをね、見ました。「アライグマ「G問題は、多角形の内側が「辺のこっち側」の積集合になることを知ってれば解けるのだ!」 フェネック「逆に、このことだけに気を取られてると嘘解法に引っかかる問題もあるよ。考えてみてねー」 https://t.co/9AbUhEnUZq」。といってもツイートがストレートに答えというわけではない。「辺の~積集合」に注目してちょっとは考えた。最大 50 角形の凸多角形が最大 20 万個あるわけなので辺の数は最大 1000 万本。これを一本一本チェックしていては最大 20 万個のクエリには答えられない。最大 20 万本の平行な辺から代表を1本だけ選ぶことにすれば、各クエリに対して最大 50 本の辺をチェックするだけで済む。提出 #31786740 (AC / 557 Byte / 1727 ms)。■自分の提出が 1727 ms のところ Ruby で先に AC していた hmmnrst さんの提出 #31756127 が 1551 ms。この差は明らかにメインループの照合部分が (a-x)*dy<=(b-y)*dx (遅い) か dx * px + dy * py >= threshold (速い) かに由来している。演算子の数が違うからね。だけど3つのペクトルをどう組み合わせれば引き算部分を事前に済ませておけるのかわからない。もうひとつ 10 行目の offsets.max_by もわからなかったよね。自分は辺と点の関係をあっち側こっち側の2値でしか扱わなかったから、値の大小を比較する max_by が選択肢になかった。外積が平行四辺形の面積なら値の大小は高さの大小であり符号と絶対値は辺のどちら側にどれだけ離れているかを表している。こちら側に一番離れている点が選ぶべき代表点であり、それを max_by で選べると事前準備の M 回の繰り返しがすごくシンプルになる。自分の提出は少なくとも2つの点で遅れをとっていた。■というのを踏まえて整理しました。提出 #31797336 (AC / 333 Byte / 1575 ms)。短く速くなった。速さは同じくらいに追いついたけどメモリ使用量がほぼ例外なく 1.5 倍くらいあるのがよくわからない。とくに富豪的な無駄遣いはしてないはずだけど……(多重代入?)。事前計算については意味を考えず単純に展開してクエリと無関係な定数部分を括りだして覚えておいた。


2022年05月17日 (火) [AtCoder] 精進。Code Formula 2014 本選-F「100個の円」(水 diff)。■AtCoder ではなかなか類題が見つからない問題。まずは面積の比較。敷き詰める範囲が 1500×1500 = 2250000。そこに置く円の面積の合計が約 1062958 (48 %)。円が四角形だとすると 1353400 (61 %)。それほど厳しくはないのかな。空き領域と置く円をすべて正方形として扱うことにする。大きい正方形ほど置く場所に困るから、一辺が 200 の正方形から順番に置いていくことにする。■提出 #31770604 (AC / 325 Byte / 60 ms)。ブログや提出一覧を見るといろいろな考え方があることがわかる。自分の解答のできがいいとは思わないけど、許容範囲の広い制約だったのだ。


2022年05月16日 (月) You Suck at Excel with Joel Spolsky - YouTube」■『Joel on Software』と『More Joel on Software』でおなじみスポルスキさん。ほぼ1時間まるまる見ちゃった。英語なので聞き取れるのはいいとこ 5 % くらいだけどそこは画面で補える。最近書いている Excel 日記をなぞる内容がほとんどだったのも理解を助けている>202204022022032420220314202202112021112020200325。■Excel の理解を助ける豆知識の補足。Excel における日付と時刻とは何か。日付は整数で時刻は1未満の小数、だと理解したんだけどどうだろう。整数や1未満の小数やそれを足したものを書式設定で日時に見せている。だからたぶん DATE 関数の値と TIME 関数の値は足し算できると思うんだけど(まだ試していない)、知らないから DATETIME 関数を探したよね(見つからなくて途方に暮れた)。■Ctrl+Enter と Ctrl+Semicolon は知ってるから聞き取れたけど、行データが並んでいる範囲の大枠(テーブル化しているわけではない)を一括して選択する方法は聞き取れなかった。何ページ分も画面をスクロールしたくないから、それはすごく知りたい。あとすごかったのはセルの値を決めてからそのセルに影響するセルのうちの1つの値を逆算させられるってこと。Excel は高機能だしはまればすごいのは確かなんだよね。セルの右下に現れる+ボタンとかマジ万能。結果が予測可能で結果が望んだものである限りは。■最近感心したのはピボットテーブルの集計値の種類に基準値との比率というのがあることと、その基準値の選び方に前の値というのがあること。前年同月比を表示する方法を調べていて見つけたんだけど、まさしくそういうニーズに応えるために用意されている項目だと思う。データベースだと行同士の関連だとか並びだとかは想定されないので、前の行の値が参照できるのは決して当たり前ではない。■@2022-05-30 『10年戦えるデータ分析入門』(著:青木 峰郎) という本の目次に「第8章 遅れて来た分析SQL最強の武器――ウィンドウ関数」という章を見つけた。「当たり前ではない」とさっき書いていながら、頻出のユースケースでもあるわけで RDBMS の独自拡張として実装されてるケースはあるかもなと思っていたのだけど、「Window Functions」を読むにウィンドウ関数がそれで、すでに普通の SQL が対応していたというのだろうか(まだよく読んでいない)。SQL については 2001 年出版の『プログラマのためのSQL 第2版』を 2006 年に読んだっきりだから、SQL で再帰ができることを 20200918 に知ったのも SQLite のリファレンスを通してだったんだよね。知識のアップデートが遅れている。