/ 最近 .rdf 追記 設定 本棚

log[2021-12-22]



20211222() [AtCoder] 精進ABC003-DAtCoder社の冬(ギリギリ黄 diff)難しいというか場合分けが面倒くさいあるいはうまい考え方があるのかもしれないけどProject Euler72 問目(20110315p01)に出てきたオイラーの φ 関数が関係するような気がするけど四辺の組み合わせを考えるだけなので全部ベタ書きした。提出 #28054417 (AC / 463 Byte / 64 ms)関係するの「ポリアの数え上げ定理」や「バーンサドの(ではない)補題といった異次元キーワかもなんか提出スクリ(#24021051)でやってる足し引きの雰囲気が似てる(←ふわっふわですよ)


20211221() [AtCoder] 改行を詰めるだけのボトに Shortest を7つほど取られてしまった残り3つ■メーリングリトやら GitHub コメトやらコミトログに機械の活動報告が流れてくると人間の活動は必ず数で圧倒されてしまうので良くないと俺は思うそういうログは人間が読むものではなくなって人を遠ざけてしまう


20211219() [AtCoder] 今日は M-SOLUTIONS プロコンオープン2021(AtCoder Beginner Contest 232) があったABCABC の三完を嘆いていたのが先々月のこと>20211010p01今日はついに C 問題が解けなかった>提出 #28000177 (WA / 341 Byte)B 問題でも WA を出した>提出 #27988292 (WA)もう終わりだよ脳細胞が死滅し尽くしている(C 問題が)解けた! 提出 #28019725 (AC / 341 Byte)特に嬉しくはないE 問題Rook Pathった前日に Queen の問題を解いていたのは不思議な偶然>20211218当然のこと Queen の解法が最初に頭に浮かんだけどそれは使えなかったそれもまた当然。提出 #28011903 (AC / 286 Byte / 523 ms)この形の DP 自分が DP を知らなかった昔に DP と知らずに書いたのと同じ形だから一番なじみがある行列累乗で高速化することまでは考えが及びませんが>#28012377 (63 ms でありつつほぼ同時刻の提出!)


20211218() [AtCoder] 精進ABC183-EQueen on Grid( diff)400 万マスのグリド問題グリド全体を一度だけスキャンして答えを出さなければいけない現在のマスにあるクイーンが移動できる先のマスを処理対象にすることはできない現在のマスに移動してくることができるクイーンの移動経路の数が知りたいコンテトの最中と直後は一歩右と一歩下と一歩右下を操作対象にして累積的な効果を持たせることを考えていてできなかった今日は ABC224-EIntegers on Gridを解いたときの記憶があったので(20211023p01.02)どういう記録をつければいいのかすぐにわかった。提出 #27972471 (AC / 292 Byte / 723 ms)わかるときとわからないときの差がわからない論理で舗装した必然の道を敷くことができないんだろうなあとは思うひらめき待ち


20211217() もはや何チャンネルなのかわからんところミニマップを表示するとBackspaceで文字を連続で削除するのが超絶遅くなるけど仕様? 使いものにならない…に対する答え書き込めなかったのでここに「たぶん3種類くらい遅さがあって 1.ックスペースをカーソル左移動と Delete の2操作に分解して実行しているがゆえにアゥ履歴が2倍記録されて遅い 2. ミニマップを表示してると文書サイズに比例して改行の入力/削除が遅い 3. 文書末([EOF]ークがある位置)での文字入力/削除がなぜかひときわ遅いさてどれでしょう 23 は同根かもしれないのと実際のところ 1 とミニマップの繋がりは(現象としては確認できても)ったく明らかではないしよくわかんない■なんかアゥに関係してかしないでか(ミニマップを含む)全ビーの再描画が無駄に行われていたらしかったBSーでカーソル前を削除時に画面が余計に再描画される事を防ぐ by beru · Pull Request #1754 · sakura-editor/sakura m_nOpeBlkRedawCount って初めて見るけどどういう役割なのかな結局行き着くところはミニマップの構造的・原理的問題だよね文書の全体を(たぶん愚直に)描画しているからいろいろと遅い全体を俯瞰するのがミニマップの用途だと思うけど俯瞰したいほど大きな文書を扱うのに難があるLOD (Level of Detail) が必要?


20211216() [AtCoder] JOI 2021/2022 二次予選 過去問から精進2問C国土分割 (Land Division)すること自体は難しくない目指すべき状態を作ることも判定することも簡単にできるだから仕切り方を全探索して数えるのは簡単にできるはず。それでは時間が足りないから効率がいいように手続きを組み立てるわけだけど実装するのにすごく迷った関数を抽出して処理がまとめられそうでまとめられなくてでもやっぱりまとめたくてできなくて。提出 #27909751 (100/ 566 Byte / 69 ms)結局抽出できたのは I 関数のみでメインの処理は似た構造を重ねた二重ループのままになったE交易計画 (Trade Plan)制約上限が頂点数辺数クエリ数すべてで 40 万なので判定はほぼ定数時間で行わなければいけないUnionFind をうまく使うだ提出 #27932262 (100/ 727 Byte / 2581 ms)もちろん一度は間違えた>WA最初からうまくはできない■飛ばされた D2 (Candies 2)解けないんだよなあDP で間違いないと思うんだけど単体の数と2数の和の2種類の数があって2数の和から単体の数(と見なせる状態)への遷移があってそういうのを整理しながら数列をスキャンしていって最大値を答えるんだと思うんだけど答えにたどりつかない


20211210()

最終更: 2022-01-03T13:27+0900

[AtCoder] JOIG 2021 過去問F 問題 デジタルア(Digital Art)

DE についてはここに書いた>20211206A,B,C については ABC-C までの難易度帯という感じで特に何ということもなく解けたので書いていない最後に F 問題が残っていた

 考え方

色ごとにその色を完全に覆い隠せる矩形を考える矩形は左上座標と右下座標で特徴付けられる面積 S を超えない範囲でどのような矩形を選べばできるだけ多くの色を隠せるだろう

 制約

グリドの一辺は最大 1000 なのでグリド上の点は最大 100 万個いくら面積 S を超えない範囲でできるだけ大きな矩形のみを考えるとしてもグリドから2点を選ぶ組み合わせは1メガ×1メガに近い数になるこれは制限時間1秒で扱える数ではない

色数の上限が 256 に抑えられている256 の3乗は約 1600 万だからRuby の場合定数倍が 1/2 とかなら3乗がなんとかなるかなという雰囲気

 どうやる?

二次元累積和であるとRange Set Queryが思い浮かんだけどどうにも(っている)定型の処理に当てはまらない

矩形の左上座標と右下座標を探索することが許されるなら色をその色を囲う左上座標と右下座標のそれぞれでソトしておくことでうまく探索してマッチングして数を数えられると思う

色を特徴付ける矩形の左上角と右下角の組み合わせを選ぶ 256 の2乗通りでは答えを漏らすのでよろしくないが4辺を選ぶ 256 の4乗通りは許されないった

 どうした

矩形の縦の長さを固定して横方向に尺取りをした

 提出 #27751046 (75/100/ TLE×9)

最後の小課題9のケースもいくつか通ってるので惜しいのかと思ったけど実は遅いケースは 10 秒とかそこらかかっていた

4重ループです。上辺について 256 通り底辺について 256 通り右辺と左辺について尺取りが 256×2 ステップその最深部で矩形に出入りする色が 256だめじゃん

 提出 #27751294 (TLE×9)

定数倍の改善Array#minmax の呼び出し回数を節約した650 ms350 ms になるレベル

 提出 #27752007 (TLE×9)

定数倍の改善上辺と底辺に関する第一第二ループを Array#repeated_combination(2) で横着せずに尺取りっぽく遷移して重複する処理を減らした550 ms450 ms になることもあるし変わらないこともあるという変化

 提出 #27772767 (TLE×1)

ついに来た! TLE は残り1ケース

改善したのはやっぱり定数倍だけど上辺に対する底辺の選び方を尺取りの幅でグループ化して最も高さが大きくなるものに代表させることで尺取りの回数が大幅に減った

もうひとつープをイテレータではなく while 文で書き直すことで Ruby の場合かなり速くなるんだけどそれに加えて答えの候補を求めるループの途中で暫定的な答えにアクセスできるようになったのも大きかったそれにより答えを更新する可能性がない場合に最内ループをスキップすることができた>or ain.size<=max

 提出 #27797091 (100/ 935 ms)

これも定数倍の改善インチキをした底辺を尺取りの幅でグループ化する部分が

i1s = I1s.group_by{|i1| i1<i0 ? 0 : [S/(i1-i0+1),W].min }

ったところを次のようにした

I1s.shift while I1s[0]<i0
i1s = I1s.chunk{|i1| [S&1|S/(i1-i0+1),W].min }.map{|_,as| as[-1] }

S&1| ってなんですかね?

とにもかくにも(1差の偶数と奇数を同一視することで)4重ループのうちの2番目のループの回数が節約できたのはとっても効いた

想定解法は3乗もしくは3乗+logとかのもっとスマトなアルゴリズムを使っているのだろうそれとも Ruby は想定外だからさっさと CrystalC++ で出し直すべき案件だったのだろう3 MiBーバーの入力ファイルを読み込むのにもつまりはスクリトの1行目の処理を終えるまでにということだけど1秒しかない時間のそれなりの割合を使っているのだよね

 デジタルアト解説 (PDF)

想定解法は上辺と底辺を固定しての尺取りだったやり方は間違っていなかったその計算量が O(HW+A^3) だというのがわかっていなかった実際は A^3 でできていたのかそれとも何かおかしなことをして A^4 にしてしまっていたのかっちだろう


っとおかしなことをしていたAC 提出の最内ループのこの部分

	ain.reject!{|wj0| wj0<=j1 }

尺取りから出て行く色を見つける部分で尺取りの中にある色の全体を都度スキャンしていた

尺取りの右がある座標に至ったときに入る色と尺取りの左がある座標に至ったときに出る色はそれぞれの合計が最大で 256 個であり一度の尺取りを通して合わせても 512 個という定数にしかならないある座標で入る色と出る色をそれぞれリトしておいてある座標に至ったときにそれらの色が尺取りの中にあるかどうかを確かめるべきだった

このように>joig2021_f.rb27あるいは最初に TLE をもらった提出 #27751046 のように>20211210p01.05

だけどたぶんこれは TLE になる(OS が違うけどローカルで測定している)定数倍の影響が大きすぎるのではない最後の TLE をクリアしたとどめの一手だって尺取りのステップ数を随時削減することによる定数倍の改善だった(S&1| だけでは足りなかったのだ)やはり Ruby で満点を取ることは想定されていないと思う


日本情報オリンピック 第2回女性部JOIG 2021/2022「情報オリンピックに初めて参加する方は出題形式・勉強法・講習会などに関する情報をまとめ「情報オリンピックの勉強法をご覧くださいとリンクされていた(JOI)ージから

JOI 本選

本選は 2 月に実施されていて4 時間で 5 問に取り組みます。上位者は春合宿に招待されます。

本選では二次予選と比べて難しいアルゴリズムの知識やそのアルゴリズムを与えられた課題に適用させるための高度な発想力が問われます。

JOIトレーニング合宿 (春合宿)

春合宿は IOI 日本代表を決めるための代表選抜会です。3 月に実施されていて4 日間連続で毎日 5 時間の競技に取り組みます。上位 4 人は IOI 日本代表として派遣されることになります。

なお春合宿で使えるプログラミング言語は C++ のみです

情報オリンピックの勉強法|高校生以下限定のプログラミングコンテトに参加しよう! - 情報オリンピック日本委員会

本選の後に春合宿がありなお春合宿で使えるプログラミング言語は C++ のみで そうなのね


20211207() 我は如何にして精進ボトとなりし


20211206() [AtCoder] 精進。JOIG 2021 過去問D - 展覧会 2 (Exhibition 2)まずは TLE & WA だけど 39/100 点の提出 #27698611よくある DP をしたあるインデックス i より右から j 個の要素を選んだ場合の価値の最低値を記録する DPこれを j1 から M に至るまで繰り返したNM の上限がともに 10 万だから二重ループが TLE になるのはわかるでも WA7(もしくは TLE の背後にそれ以上)あるのはわからん■個数と価値を記録するのでなく個数だけ記録するのはどうだろうかと考えたi 番目の絵画の右と左に合わせて M-1(以上)の絵画が飾れるならi 番目の絵画の価値は答えの候補になる右からと左からの2度のスキャンで済むから処理時間は足りるだけど M 番目に大きい価値がいくつになるのかがわからない■制約をメタ読みすると N^2 はダメでも NlogN の処理は許されているある価値で足切りした場合にいくつの絵画が飾れる足切りラインの探索に二分探索をいくつの絵画が飾れるか調べるのに2度のスキャンを繰り返してもまだ時間は足りる。提出 #27735789 (100/ 617 Byte / 792 ms)■スキャンは2回1セトである必要はないみたい自分にはわからんけどもJOI が何かも知らないなら JOIG が何かも知らなかったけどGGirlsGったらしいEGOI などというものもあって J () 固有ではないらしいけどあえて for Girls をもうけるモチベーションはよく周知してほしいと思うわからないから女子を集めて愛でるためではないだろうし数的能力に性差を認めて平等に活躍の機会を与えるための不平等な取り扱いというわけでもないだろうし母集団の大きさが違いすぎるのかなという気はするけど分類の基準は性別に限らず能力別も考えられるはずで決め手に欠ける感じがあるE - パレ(Parade)普通かな逆行する回数を1ずつ増やしながらプライオリーでダイクトラ法を繰り返した。提出 #27742640 (100/ 1112 Byte / 535 ms)頂点 0 と頂点 1 から 0 への辺を追加するとメインループのコピペが解消できる


20211201() スラム化が促進するアパトの“空室”問題 それでも郊外のアパトが増え続けるのはなぜか | 文春オンライン■記事の内容には興味がないんだ因果関係を確かめるために最後のページまで読んでしまった3ページ目から空室率の上昇はアパトのスラム化を促進する 促進するが自動詞でもあるなら記事のタトルはどちらの意味にもとれるけどそうではないのでどちらがどちらかわからなくなってるまあポジドバックがありそうで区別の必要がないような気もするがそういう意図があって書かれてはいないと思う■空室問題は誰の問題執筆者の経歴はこちら>牧野 知弘 プロール | 文春オンライン記事の最後に『空き家問題という著書へのリンクがありそのレビーによると空き家問題を抱える個人にとっては期待はずれの内容で日本の税や住宅政策を原因とする構造的問題を取り上げたいらしいだけども記事の方は違うトルや最終ページの最後の方の内容(空き住戸の多いアパトは住んでいても気持ちが悪く治安も悪化する住環境の悪化を嫌う住民は他の新しいアパトに移り懐に余裕のない住民だけがアパトに残る当然賃料の引き上げには応じる余裕はないしその気もない住民層も若年からもはや世の中の動きから取り残された高齢貧困層などに替わっていくだろう)からはそういう大きな問題意識は伝わってこない空室問題は問題なの記事からはそこが読み取れなかったのでプロールから著作のレビーまで読むことになってしまった■政策ミスによる無駄の誘導は是正してより価値あるものを残すべきだと思うけどそれを大家の問題に矮小化しているようにしか読めないそして大家が抱えることになる問題は(お金がない)住人視点では問題に見えない


20211130() [AtCoder] 昨日あった ARC130CDigit Sum Minimization制約が貪欲しか許さないと告げている繰り上がりが起こった場合にしか和が減らないのはわかった繰り上がりがある前提で繰り上がりを連鎖させるために桁の和が 9 から 18 になる組み合わせをこの優先順位で作っていくのが良さそうただし最初に繰り上がりを起こす和(10 から 18)の作り方がまずいとサンプルの2が合わない敗因は単独で繰り上がりを起こす1桁目を全探索しても許されると解らなかったこと今日の提出 #27603786 (AC / 782 Byte / 712 ms)数字の操作ではなく配列の操作を繰り返していて間に合ってるんだもんなあ■あ昨日じゃねーや消えた月曜日


20211126() [AtCoder] 精進JOI 2020/2021 本選 過去問 C集合写真 (Group Photo)少し考えると許される並びは一直線に右下がりの並びを基本として何か所かでちょん切った右下がりを逆順に配置したギザギザ右下がりしか許されないとわかるそれを制約上限 5000 を4秒以内で求める手順とはDP ですね1以下の H をいい感じに並べる手数から始めて2以下3以下……をいい感じに並べていくと最後に答えが出る提出 #27502421 (64/100/ TLE×15)制約が異なる小課題のうち最後の小課題5がすべて TLEったアルゴリズムのオーダーが間違っているN の二乗に BIT 由来の log をくっつけたのが良くなかった提出 #27509632 (TLE×15)同じ TLE とはいえ実行時間は 44xx ms から 40xx ms に改善しているここからは定数倍の改善で 100 ms を稼げばなんとかなるこの提出では二重ループの内側で BIT を利用するのをやめて N^2 のループで前処理をした処理を1か所にまとめようとしてループを重ねて計算量のオーダーを悪化させるより同じオーダーのループを2つ並べる方が速いということが盲点になっているMaximize GCD のときも気がつけなかった>20210919p01.03今回のメインループは N^2 なのだから大概のことが前処理でできるBIT の代わりになる N 個の累積和(配列)を用意しても許される提出 #27510644 (AC / 3120 ms)前処理で扱う配列の長さを必要な分だけに切り詰めた要素数の合計が N*N から N*(N+1)/2 に減ったと思うあとは配列参照を減らしたり数字の微調整をなくしたり reverse_each をなくすために最初から逆向きの配列を用意したりという爪に火をともす努力そういうの好き結果として AC 提出が一番短くなって 277 Byte


20211125() [AtCoder] 精進ARC124-DYet Another Sorting Problem(ギリギリ黄 diffそんなアホな)これは Swaps の仲間なのかな>20200826p0120211022p013つの中でこれが一番頭が爆発した問題だった実際にソトして数を数えても許されるあたりは厳しくはないんだけど添字と値が入れ替わって入り交じるスワップ操作で頭がこんがらかるそして最後の最後にも罠があった>(gn-gm).abs提出 #27485094 (AC / 515 Byte / 188 ms)ほぼ一日かかった■考え方はいろいろあるのかな自分はまず反対側の領域にもぐりこんでいる要素を探したそしてそこに本来収まるべき要素を探し探した要素があった場所に本来収まるべき要素……を芋づる式に探してグループとしたただしグループは前半領域後半領域のどちらかの中にだけ作って領域をまたぐグループは考えなかったこうやって1つずつ反対側に移動している要素の位置を移動しながらついでにソトもしていくと最終的に反対側に移動している要素はなくなり前半後半のどちらかに閉じて位置を交換していてソトされなかったグループが残る反対側の未ソトグループが利用できる場合は利用して互いに交換回数を節約しながら全グループをソトするこの手続きに基づいた解法がどのような考えからひねり出されてきたかというと必ず行わなければいけない操作を無駄なく行うというところから貪欲法?