/ 最近 .rdf 追記 設定 本棚

log[2021-11-07]



20211107()

最終更: 2021-11-12T21:42+0900

[AtCoder] AtCoder Beginner Contest 226E 問題 Just one

解けなかった

 提出 #27107258 (WA×9 / AC×24)

これはコンテト中の提出WAAC の比率からして惜しいのかなという感じおそらく 0 を返すべきケースで 0 が返せていないそれはどういうケース連結成分が8の字になっていたりして輪っかが1つではないケース

しかしそれをどうやって検出するのか解らなかった

 提出 #27118298 (AC)

これはコンテト終了後の提出っきの WA 提出では UnionFind で閉路の検出(だけ)をしていたのだけどもうちっと細かくド数と辺の数の両方がわかるように記録をつけた

辺の数がド数より1だけ小さい連結成分は木であり辺の数はこれが最小辺の数とド数が同じ連結成分はループが1つとオプションで突起をいくつか持っている辺の数がド数より多い連結成分は複数のループを持っている

題意を満たせるような連結成分は3種のうちの1つだ他の2つが存在すれば答えはゼロだし適合する連結成分のみが A 個あったなら答えは 2.pow(A,998244353)

ここまで考えがまとまるのに2時間かかってるんだよなあ

 なもりグラフ

なん「なもりグラフという名前があるらしかった調べようとしたらゆるゆりの人と名前がかぶってて検索性が悪かったのだけど別に間違ってはいなかったなもりを検索してなもりが見つかるのは当然

chokudai(高橋 直大)🍆@chokudai

F問題の由来でN頂点N辺の連結なグラフ「なもりグラフと呼ぶ人がいるのもこれが理由です。 https://t.co/saSTvA1lep

Twitter

F 問題ってAGCFNamoriゃないですか(やだ)diff の精進は 10 年後も手つかずの見込みですから

これもあったARC079-FNamori Grundydiffどうかなあ解説 AC が1つあるだけだけど10 年後は


20211106() [AtCoder] 精進ARC070-DNo Need(ギリギリ黄 diff)NK の上限が 5000 なんだけどO(NK) を通すために C++ で殴ってしまった。提出 #27059260 (AC / 106 ms)なんという甘えなんという芸のなさしかし 11 個目の黄 diff AC であることに変わりはないないったらないRuby でのすべての提出を見るとっかり Ruby で通している人がいますね1241 ms1010 ms14 msこれで全部98 Byte/14 ms の提出は頭おかしいと言わざるを得ないなんだよそれ■自分の方針ある要素に注目したときそれ以外の要素を組み合わせて作れる和にある要素を足して初めて K に届くようなケースが1つでもあるならその要素は不必要ではないそれを左右からの DP■入力をソトしてみたりもしていたんだけど大小関係を要不要の判断に活用する方法が思い浮かばなくて消してしまっていたRuby での AC 提出はどれもソトしている大きい要素から順番に K 未満の和の集合を作っていくことを考える和のどれかに現在の要素を加えて K 以上になったならその要素は不必要ではない同時に処理済みの要素(現在の要素と同じかより大きい)も現在の要素と交換することで不必要ではないと判断できる最初の判断に利用した和の構成要素であったかどうかには影響されない和の集合だけどK 未満で K に一番近いものを1つだけ覚えておくのでいいK に1足りないだけなら値が1の要素も必要にできる7割8割くらいまではわかってたんだけどな(負け惜しみ)K 未満で K に一番近い和だけど要素を大きい順に処理していることで自然に求まるかと思ったけどそんなことはないよねDP が必要。提出 #1172583 を理解するには考察が足りないN=4; K=100; A=70,50,49,1 という入力に対して左右から DP をする自分の提出とトして二分探索して両端をメモして DP の回数を抑えている(っぽい)提出 #44808400 を返しているところ提出 #11725831 を返す。14 msRuby 最速の提出は嘘解法ということでよろしいRuby で通った! 提出 #27128108 (AC / 1997 ms)AtCoder では TLE を確定するまでに3回くらい実行を繰り返すというような話を聞いたけど、2026 ms みたいに TLE だけど実行打ち切り(22xx ms など)ではなさそうなタイムの時は再提出することで試行回数が増やせます。だけど提出直後の2回目の提出はっかりミスを訂正するよくある提出パターンとして許されているけどそれ以上の連続提出は規制されているそうDoS 攻撃になっちゃうからね公式解説を読むと O(NK)O(NKlogN) が想定解であってO(NK) は速い方だったっと雲行きが怪しいぞ自分がやってたのは O(NKK) の三重ループじゃあないですか(それでも通ってしまう C++ の犯罪性の高さよ)でも Ruby のは二重ループだから


20211102() [Ruby] 読んだYJIT: CRuby向けの新しいJITコンパイラを構築す(翻訳TechRacho by BPS株式会社Rubyオブジトの未来をつく「シェイプ(翻訳TechRacho by BPS株式会社■2番目のリンク先の冒頭Rubyが他の言語に比べてときどき遅くなることがある理由を聞かれたら私な「もしも〜だったらを筆頭の理由に挙げます。 Rubyの実装ではプログラムを実行するとき「もしもこうだったらああだったらを考えるのに多くの時間を費やします。足し算のたび「オーバーフローしたらどうするかメソドを呼び出すたび「メソドがモンキーパッチされていたらどうするかドの11トレースが有効にされていたらどうするかといったことを判断しなければなりません 型付けによってプログラマが違反に対するペナルを引き受けるからRuby は高速で突っ走ってくれと指示するモドが欲しくなったりするRuby で導入されつつある型はそういう用途ではないらしいけど「シェイプが期待に応えるという話ペナルはありません■これも読んだAsync Ruby - Bruno Sutic すごく楽しみな機能A word of notice: Async does not get around Ruby's Global Interpreter Lock (GIL).という前置きの解釈がわからないしなんなら直訳も理解してないけど共有リソースにアクセスすると全然 async にならないよってことなら想定内だけどドロックしない/させないやり方は想像できないFiber についても知らない最後にこう書かれてるしサンプルのチョイスもこの通りなのでAsync's strongest point is scaling network I/O operations, like making or receiving HTTP requests. Threads are a better choice for CPU-intensive workloads, but at least we don't have to use them for everything anymore.自分には使い道がないかもしれないそれでbutには同意するほかない


20211101() [AtCoder] 精進ARC023-Cタコヤ木( diff)累積和の累積和の累積和の……を求めたいのだけど累積和の項数と累積和を重ねる回数のどちらかが N(2000)でどちらかが A(10^9)で制約されるので手続き的に答えを求めることができないとりあえず 10×10 の表を作って眺めてみてWikipedia パスカルの三角形を検索したそうしたらコンビネーションで求められることがわかった。提出 #26976714 (AC / 427 Byte / 64 ms)同じページ「カタラン数の文字も見えたこれは ABC の関連ツイトで見かけたことがある(が知らない)■検索してブログを読むと仕切りを加えた組み合わせを考えることで累積和やらパスカルの三角形やらを経由せず直接コンビネーションを答えに導けるようだったそれは高校で習ったし AtCoder の問題でも利用したことがあるっているが引き出せなかったむむむ


20211031() [AtCoder] 精進ARC064-ECosmic Rays( diff)解けてみれド典型という感じだけど初見ではグラフが見えなかった問題を読むのは今日で2度目。提出 #26961806 (AC / 956 Byte / 1915 ms)つい先辺に重みがあるんだから BFS ではなくダイクトラ法を使うべきだというのはあるかも実装も定数倍も重くて気が進まないわけなんだけどと書いたばかりで重くて気が進まないプライオリーでダイクトラ法をしたところで Ruby の他の提出を見ると 500 ms を切る提出がちらほらあってプライオリーは使っていないまねしてみたのがこれ>提出 #26962407 (AC / 413 Byte / 221 ms)短くて速いっ? どういうことなの? N の総数が高々 1000 だからなのか完全グラフだからなの(完全グラフという数日前に初めて見た単語を使ってみたWikipedia によるとクリークと関連があるらしいクリークの初見は3か月前>20210716)


20211027() [AtCoder] 精進ABC169-FKnapsack for All Subsets( diff)よくある DP をすると TLE が必至なのでA 数列の同じ値を和と場合の数にまとめてから頑張って掛け合わせた。提出 #26852407 (AC / 798 Byte / 841 ms)そしたらねRubyトツ一番速い提出がこれ>#13965887 (195 ms)numo/narray ですってそれ以外の提出は 600 ms 台に先頭集団がある他は1秒オーバーがほとんどなんだけど(Ruby によるすべての提出)長さに関してはどの提出も自分の 798 Byte より短い何か見落としがある! これが短くて速い代表的な提出だけどほとんどワンライナ>#18041479どういうことなの? ×2するところを÷2にすることで要素の更新が省略できて速いらしいんだけどそもそも持っているデータが違うから×2も÷2もないんだよね■繰り返される配列の確保と初期化が重かったのでできるだけ短い配列で済ませるようにした>提出 #26862342 (AC / 717 Byte / 679 ms)考察がへぼでも 600 ms 台に入った添字 1 から A の値未満のところは初期値から更新されないので不要なのだけど添字 0 のところに意味のある値が入っているのが邪魔配列をローテーションしてから長さを切り詰めている難解へぼな考察を実装でごり押ししているのが悪い


20211026() [AtCoder] 精進ARC063-E木と整数( diff)提出 #26833318 (AC / 1419 Byte / 463 ms)すごく難しかったです。ドに持たせた情報は入力で与えられた確定数字と数字までの距離たとえば数字が P で距離が D ならそのドが取り得る値は P-D から P+D の間で1つおきの数字のどれこれを頑張って子ド間でマージしながら矛盾なく根っこまでたどり着けたら答えは Yesっこの値を1つ選んで今度は下りながら子の数を確定していく今のところ Ruby での AC は3つなんだけど(Ruby によるすべての提出)どれも異なる考え方で書かれている気がするどういうことなんだ? さておきこれで黄 diffAC10 個目着々と増えている■解説を読むとドに持たせるのは数字と距離ではなく取り得る数字の範囲にすると楽そうだったそれでやると Corvvs さんのこちらの提出になるようだ>#4817029自分でもやってみた>提出 #26837318 (AC / 722 Byte / 434 ms)枠組みはさっきのとほぼ共通なんだけどドのマージ部分であれこれ考えずに min/max で済ませられるのがすごく楽他にはプライオリーで解いている人もいますが……(根本の方針がさっぱり想像できない)小さい数字から順番に埋めていってるっぽいそれで自然と均衡点が定まってくるというのはなんとなく想像できるけどなんとなくだよそのやり方でうまくいくときは必ずうまくいくということに確信が持てない(ので自分では書けない)こちらが参考になる>ARC063E 木と整数(800) - tekiheiの日記っくりかえっても自分の頭からは出てこない発想


20211023()

最終更: 2021-10-26T00:58+0900

[AtCoder] AtCoder Beginner Contest 224D,E

D 問題で TLE に苦しんだE 問題も TLE に苦しんだそのまま E 問題が解けなかったので F 問題は読めなかった

 D 問題 8 Puzzle on Graph

全探索が許されそうな制約重複チックのためのハッシュ表のキーを文字列にするか配列にするかで悩んだ結果的に文字列ベースの探索で AC になった

 提出 #26768646 (TLE×1 / over 4 )
 提出 #26770107 (AC / 2275 ms)

欠けてる数字を9番目の要素にするのがちっとした Tips. TLE 解消の決め手にはならなかったんだけど

現在の状態からありうる次の状態(のうち初出のもの)をすべて候補にするという意味で感覚的に全探索と書いたけどそういうのは幅優先探索と呼ぶらしかった

 E 問題 Integers on Grid

時間は1時間ほど残っていたのに結果的に1時間と 10 分が AC までに必要だった

 提出 #26776942 (TLE×18)

D 問題の TLE×1 と違って全然惜しくないどこの処理量が膨れ上がるかとソースを眺めてみると遷移のための辺を逐一処理しているところがダメ

遷移の方向は A の小さい方から大きい方に決まっているのでA の降順に遷移可能回数を数え行と列にその回数をメモしておけばいい今後この行(この列)から遷移先を探すものがあるならメモした回数だけ遷移できますよというメモA の降順に処理しているから参照したメモはいつでも有効

ああいやA の値が等しい別の点が書き込んだメモを参照しないようにだけ注意が必要この辺の呼吸は珍しくないので心得たものである

 提出 #26781610 (AC / 1230 ms)

あと 10 分あればなあ

 提出 #26786787 (AC / 708 ms)

不要になった処理を消し忘れてた

トはちっとだけ上がってるしかしもっと上がりたかった


20211022()

最終更: 2021-11-23T22:07+0900

[AtCoder] AtCoder Regular Contest 120C 問題 Swaps 2

精進ですよdiff だけど難しい(まるで水 diff が簡単かのような……)考えがまとまるまで1日かかった

 問題の操作

隣接2要素をスワップして +1/-1 するというけど考えやすいように複数の操作をまとめるとこう

  1. ある要素 Ai を右に(左に)いくつか移動する
  2. たとえば右に5移動するなら移動先の値は Ai-5 になる
  3. たとえば右に5移動するなら飛び越された5つの要素が移動先に空きを作るためと移動元の空きを埋めるために1つずつ左に移動している
  4. 左に1移動した5つの要素は値を +1 する

 ポテンシャル

Ai の値は移動に伴って変化しているように見えるけど実のところ位置に応じて決まった値をとっているに過ぎないどういう値をとるかは最初に位置 i で値 Ai をとっていたということで決まる

A 数列の各要素が位置1でとる値をその要素のポテンシャルと呼ぶことにするポテンシャルから要素の位置を逆引きできるようにインデックスを作成しておく

 B 数列

B 数列をスキャンしながら要求するポテンシャルを計算し該当する要素を A 数列の先頭に近いところから貪欲に引っぱってくる

っぱってくるに際していくつの要素と位置を交換することになるかは BIT で転倒数を管理することで数えるというか知る必要があって管理している数字が転倒数と呼ばれているが順序として正しい

 提出 #26732769 (AC / 561 Byte / 491 ms)

難しいこれが水 diff ってどうかしてるちなみに Swaps の1はこれ>Swapsdiffす。解けるまで9か月寝かせました(20191111p0120200826p01)2は1日寝かせただけで解けたんだから妥当なのか?


20211014() [AtCoder] 精進ABC160-FDistributing Integers(ギリギリ黄 diff)最近よく見る全方位木 DP20210928p01.0120211010p01.06ド間の式は ABC217-FMake Pairに提出したものと同じ(#25683515)ドが自身を含めて A 個の子孫ドを塗る方法(順番列)B 通り持っているとき2つの子ド以下を塗る方法は B1×B2×(A1+A2 個から A1 個を選ぶ組み合わせ)で求まる。提出 #26559753 (AC / 1028 Byte / 1548 ms)これで黄 diffAC は9個目かなり貴重■全方位木 DP と言えば第八回 PASTH最短経路制約が N3000 だから全ペア 900 万通りの全探索が想定解法かなーと想像したんだけどRuby にはやや厳しく見える数字最近覚えた全方位木 DP>提出 #26574539 (AC / 72 ms)ドのマージ部分が全方位木 DP 問題唯一のアイデンィテドに子孫ドへの距離一覧をハッシュ表で持たせたあとは全要素更新を避けるためのオフセト値を表とは別に持たせたりマージテクなどの時間節約術ところで提出した解法を全方位~と呼んでいいのかはよくわからないドを起点にした距離を調べてはいるんだけど距離って指向性がないので頂点ペアを片方向しか調べなくていいわけなのでただの木 DP と同じように根への1パスで処理が終わっているBFS で全点間距離を調べる方法はやっぱり厳しかったゴルフしながら1秒前後で通してる提出が多数あるからそうでもないのかなって思ってたけど実際厳しかったあの短いスクリトのどこにどんなアルゴリズムがあるというのともあれ最終的には BFS でも通った>提出 #26823765 (AC / 814 ms)どういう時短術を使ったX を超える距離はすべて X 以上という扱いにしてそれより遠くの頂点は調べなかったその場合でも最内ループでチックをすると TLE がひどいので(#2682352013 行目)その1つ外でチックをした(ACドの 11) (よく考えると TLE がひどいのは距離表の更新がスキップされてるからでX を超えていてスキップするのはキーへの追加だけにすべきだった)最も効いたのはすでに距離一覧を調べてある隣接ドの結果を流用したことそうすると開始点から出る辺のうちの1本から先にあるドは距離を調べずに済ませられるそのために距離表はオフセト値とセトにして初めて実際の距離を表す。この点は全方位木 DP でのやり方と一緒くらべて不利な点は距離一覧ではなく具体的な頂点とのあいだの距離を一覧して持っていて等距離にある2点を同一視できていないので扱う数字が多いことと結果の流用が辺の1本に対してしかできていないことこれらの差で全方位木 DP に負ける辺に重みがあるんだから BFS ではなくダイクトラ法を使うべきだというのはあるかも実装も定数倍も重くて気が進まないわけなんだけど■同じアイアでちっと前の ABC で制約が厳しくて想定解法のワーシャルフロド法が通らなかった問題が通せないかな


20211013() [AtCoder] 精進ARC089-DChecker( diff)大きさが 2K×2K で黒白2マスずつの最小市松模様に 2N 個の点をプロトしておいてK×K の枠内に最大でいくつの点が含まれるかを二次元累積和で求めるのだと思った概ね正しかったのだけど二次元累積和のサイズは 2K×2K ではなくて 4K×4K が必要らしかったわからないが言われたように修正してみる。提出 #26544471 (TLE×8)定数倍がたいへん厳しい。提出 #26544665 (AC / 956 ms)元データが 2K×2K なのだから愚直にデータを展開せずとも計算で仮想的に 4K×4K を存在させられるところでこの人の提出>#2789430すごく短いのと累積和のサイズが 2K×2KcN-c を同時に答えの候補にしている部分がよくわからないわからなくはない黒く塗るか白く塗るかだそうすると 4K×4K が必要というのもK×K の枠内が■□■□になる場合と□■□■になる場合を網羅するためだったゃあ 3K×3K でも? そもそもさっきの仮想累積和の提出(#26544665)3K×3K の累積和上を K×K の枠が移動する 2K×2K 通りの探索になってたっぽいわかってやってるんじゃあないんだよなあ


20211012() [AtCoder] 精進ARC088-DWide Flip(ギリギリ青 diff)まずは問題を理解する「操作には2つの端点がある「端点は 01 の境界に揃えたい(←この表現)そうすれば操作のたびに端点にあった境界が消えるさもなければ新たな境界が生まれるがそれは嬉しくない(←この表現)「一方の端点を文字列の先頭または末尾に固定して手近な境界から貪欲に消していけばゴールに至る「文字列の真ん中より手前側にある境界は相方に任せて良い提出 #26527889■一番最初に思いついたゴールに至る確実な答えは最も短い 111...(000...)の長さを操作の最小幅にすることだったこれをどこまで伸ばすことができる文字列の端っこまで伸ばしたとき答えが見える


20211011() ベテラン「適当でいいよは真に受けちゃいけない→ベテランと新人『適当にはこれくらいの違いがある - Togetter■適当に正反対の意味があるのって判断の基準が主観にあることで結果がピンキリになりピンの結果とキリの結果がどちらも適当にやった結果扱いされるせいで起こる現象だと思ってるなかなかに味わい深い言葉適当でいいという指示こそがテーであり適当ではなかったのであり言葉からしっぺ返しを食らっている的な本当にテーでいいなら指示が必要な場面ではなかったはずだし期待する結果も期待外れの結果も存在し得ないのが道理「適当でいいよではなく「もうそれくらいでいいよなら許されたのかな