/ 最近 .rdf 追記 設定 本棚

log[2024-06-22]



20240622() [AtCoder] 今日はユニークビジョンプログラミングコンテ2024 AtCoder Beginner Contest 359があったF 問題まで解けたけどなぜか D 問題が解けない謎の回ではふりかえりACount Takahashi普通に Takahashi を探したけど制約を読めば T を数えるだけでも良かったらしい他の人の提出で知ったそうか手の抜き方を見習わないといけないな無駄にコンピングパワーを使ってしまったBCouples正規表現の先読みでやったけど結構複雑で罠もあるパターンになったので(/\b(\d+)(?= \d+ \1\b)/)普通に Array.each_cons(3).count{...} でやるのが良かったCTile Distance 2数え方が ABC353-F Tile Distance と同じ斜めを数えてから縦と横を数える横移動のコト計算が難しかった目的地がタイルの右側か左側か判別してから右と左のどちらから移動してくるのか場合分けをしたDAvoid K PalindromeABCDEF で一番難しかったっとねまず否定で良い文字列を定義するのをやめてほしい(わがまま)かなり長いあいだ勘違いしていた何を数えたらいいのかまだわかっていない長さ K の枠の中について回文があるとかないとかを数えるとするじゃないでも枠の外を数えることができない重複を省いてどうやって数えられるのEWater Tank特別なデータ構造はいらないスタックが1つと数を1つ覚えておくだけで答えが出せるこういう単純な道具をこねこねする問題は好きだけど前回の D 問題が灰 diffったことを考えるとdiff どころか茶 diff があるかどうかもわからないと思う高めに出てもそれは D 問題の壁があったからだよFTree Degree OptimizationRuby での他の人の提出を見ると自分のよりずいぶんとシンプルで自分には見えていない何かがあるのかなと思わされる自分が考えたこと各頂点が単独でばらばらに存在していて(相手のいない)辺を1本伸ばしているトはその頂点の値(A)と現在の次数による木を作るのだからN-12本の辺を選んで繋ぐことを繰り返す。繋いだときにコトが発生してそれぞれの頂点からはまた新しい辺を生やす。辺を選ぶのにプライオリーを使ったけど同じ連結成分から生える2本の辺を繋ぐことはできないので単純にキーから2つ取り出して繋ぐというわけにはいかない自分はキーを2本使った1本目のキーにすべての辺を入れて2本目のキーには最小コトの辺とそれと同じ連結成分の辺を入れたそうすると2本のキーの最小同士を連結することでうまく処理が進むだけど他の人の提出を見るとーは1本で足りるみたいなんだよねどう考えるとそうできるのかわからないF 問題次数の和が 2(N-1) になることを利用するのかなーには常に N 個の数を入れておいて2つ取り出してコトを計算して2つ戻す。自分の提出が無駄に複雑になったのは個々の頂点の繋ぎ方を区別していたからだ次数だけをカウトして繋ぎ方は考えないでおくとシンプルになるたぶんねほらね。提出 #54856675 (AC / 753 Byte / 562 ms)ほらねじゃない2つ取り出すのは嘘だった1つずつ N-2 回取り出す。次数の和が 2(N-1) になるというだけでは条件が足りない気がした各頂点の次数が最低でも1あるというのも条件なのかなだから次数 N は予約済みとして残りの N-2 をキーから引いたF 問題tinsep19 さんのこの提出 #54855773 は個々の辺の繋ぎ方を考えつつもシンプル木の問題の制約で自分が好きな形式があってこういう形で親を定めるもの p2,p3,p4,...,pN (1pi<i)これでどんな形の木も作れるんだよこれと同じ考え方で処理を進めていてシンプルになっている自分の考えが1つも2つも足りないのが明らかになっていくなあF 問題自分の最初の AC 提出には嘘があると思う辺を繋いで新しい辺をキーに追加するときに2つ目のキーが空かどうかを確かめて適切なキーに追加するようにしないと取り出し済みのコト最小の辺と2本目のキーに入っている同じ連結成分の2番目以降の辺のトの大小が入れ替わってしまうおそれがあるこれは自分がキップを参照するのではなくとりあえず取り出してみた最小値を変数に保存して利用しているせいで生じているバグあぶないところだったなあGSum of Tree Distance全方位木 DP だと思ったら普通の木 DPったDPDP の中でもやりやすい印象を持っている積み上げの基礎となる葉の部分が最も単純でとっかかりとして好都合だからだと思うその代わり子のマージに神経と時間を使う。提出 #54881518 (TLE×2 / AC×50)2ケースダメでした何が弱点だろうメモリ消費と時間がだいたい比例しているメモリ消費は Hash かなと思うけどどういう形の木だと無駄が増えるんだろう単純に頂点数じゃあないんだよな■精進D 問題XABC305-G Banned Substrings の簡易版だと読んだので自分の提出 #42262239 をなんとか解読してそれっぽいものを書いた。提出 #54884526 (AC / 496 Byte / 147 ms)おもしろいのはっていうかやられたなって思うのは入力文字列中の ? の出番がごく控えめなこと力技で長さ N の良い文字列を構築していくにあたって入力文字列中の AB はふるいとしての役割を果たしているのだけど、? というのは A でも B でもいいという意味だからふるいとして働かないことが機能なのだ注目する部分が間違っていたしプログラムの構成も全く予想していないものだったG 問題トイレでひらめいてしまったージテクのためにサイズでソトしてるんだけどそのサイズって5とか3の固定だったりしませんってからデバッグする。提出 #54896069 (AC / 839 Byte / 3169 ms)通りましたまさかのマージテク失敗が TLE の原因だったあれこれ考えることが多いと手癖にまかせて .sort_by(&:size) とか書いちゃうんだなところで今確認したところ tinsep19 さんが G 問題を 528 ms で通している同じ Ruby なのに桁が違うんだけど何をどうやっているのか知りたいが読んで知りたくはないんだなF 問題「自分の最初の AC 提出 #54840376 には嘘があると思うと書いた実際に確認したところ新しい辺を無条件に2番目のキーに入れていたので懸念していたコトの逆転は起こらないはずだけど代わり「2つ目のキーが空かどうかを確かめて適切なキーに追加することができていなかったことが明らかになったこれの何がまずい新しい辺を空っぽの2番目のキーに追加するとそのキーから選ばれた辺が次に繋ぐ辺の一方として必ず使われるんだけどこれがコト最小であるとは保証されない1番目のキーから取り出されたものを2番目のキーに入れるからコト最小が保証される一方でこれが WA の原因にならない理由もわかってきたどれか1つ任意の連結成分を選んでこれに属する辺を2番目のキーに入れると決めることでも N-1 回の操作で木を構成することができる自分は UnionFind を使っていながらミスによって UnionFind による連結成分の管理を必要としない木の構成法を実行していたなんだかなあ考えが2つ足りず(次数への着目インクリメンタルな木の構成法)実装ミスをし(追加するキーの選定)ミスしたと勘違いをしていた(IMKK)素直に F 問題の AC を喜ばせてはくれないの


20240621() X で見かけた「階段を1段もしくは2段ずつ上るときにある段に至る上り方はボナッチ数になるらしいっそうなんだって新鮮な驚きだったよねDP の遷移から漸化式を見ようとしたことがなかった2次元以上になるとまた何も見えなくなるんだけども


20240615() [AtCoder] 今日は CodeQUEEN 2024 予選 (AtCoder Beginner Contest 358) があった良くないできではあるがしかたがないというあきらめもあるF 問題はどうにもならないではふりかえりをAWelcome to AtCoder Land比較しま「空白0x20改行を 0x0A だと決め打ってもいいよねしなくていい split はしないBTicket Counter前の人から順番にシミュレトすれば答えになるCPopcorn制約が小さいので組み合わせる数を決め打ってから全組み合わせを試した考えなくていいので隙あらば全探索またの名を総当たりブルトフースDSouvenirsーヴェニール? ou をウと読ませるのはおフラっぽいュルナリステンカムフラージウイノン…………以上! つい最近までこれがお土産だとは知らなかったのでなのにお土産っぽい雰囲気がしたのでこういう名前の問題があったのだとわかる思わず問題名に2って付いてないか確かめた日記を書いている今調べたら該当する過去問は ABC286-E Souvenir でありあちらは単数形こちらは複数形という違いがあったのだったまあいいや値段と個数を1つのパラメータで決めてしまうってなかなかおかしいね二度見した要求を下回らない限り最も安いものを選べばよいB の昇順に処理を進めるなら A も昇順にスキャンするだけで済むB の降順だとそうはいかないし正当性にも不安が生じる(実際には問題ない気がする)EAlphabet Tiles問題を勘違いしていて解法が間違った枝に入り込んでしまって余計な時間を使ったどこに分岐路があった作る文字列は長さ K に限らず1以上 K 以下であれば良いのだった最初の間違った解法はK 文字のうち k 文字が確定している場合の数を文字種ごとに数え上げていく DPった長さ K の答えは合っていたけどその他の長さは合わない長さ K の答えは合っていたので同じ方法を K 回繰り返すだけで答えが出るのはわかるしかしこれはまともな時間で完了しなかった1から K までの一連のプロセスを通じてそれぞれの答えを見つけなければいけないインクリメンタルに答えを出していかなければ間に合わないそうすると必然的に DP で持つべき状態が決まるあとは状態と状態をつなぐ遷移がどうなるしばらく悩んで見つけた次の解法はk 文字が確定しているときにある文字を1から c 文字まで挿入して k+1 から k+c の文字列を作る DP答えは合ったけどローカルで 30 秒以上かかる自分の PC16 秒だったら2秒制限でも AC になるのは ARC179-B の精進でわかっている(20240602)シスムを HDD から SSD に移し替えたときにジッジサーバーとの速度差が2倍程度に追いついたのだけど最後の言語アップデト以来っと8倍に広がったの? 30 分以上高速化に費やして結局 AC までに1時間ちかくかけた厳しい何をやったコンビネーションの前計算をしてそれだけでなく共通項をループの外に括りだして掛け算の回数を減らしたりDP 配列の複製を抑制して in-place で値の更新ができるように処理順を入れ替えたりしたそれでもコドテトで 3.5 秒だったり 2.5 秒はかかるAC 提出は #54600449 なのだけど最後の決め手は 20 行目の %P の位置だった3項の掛け算のあとに %P をくっつけていたのを前にずらして2項の掛け算にするだけで2秒オーバーが1秒未満になったRuby にはオーバーフローがないからついテーに %P を付けたり省いたりしてしまうんだけど(%P が多すぎても少なすぎても TLE の原因になるのだ)同じ1回の %P でも位置によって効果がだいぶ違うんだなあFEasiest Maze出力形式難しすぎそして問題文が間違っていた「壁があるときに辺で結ばれていて長さ K の唯一のパスを構築する(大きさ K の連結成分では十分ではなく塊やループや3つ以上の端点があってはいけない)というのでは壁の既成概念が崩壊する質問と訂正があるのを待つことにして A 問題からの実装を始めることにした終了の 25 分前に戻ってきたら問題文の修正は終わっていたが差分を調べるのが面倒で読まなかったすること自体は難しくなさそうに見えてやりきるのはすごく難しいかも自分の頭で考えて答えを構築するなら縦と横の偶奇の扱いがやっかいったら機械に長さ K のパスを探索させれば何も考えなくていい100×100 というのが素朴な DFS にとってどれだけの規模感なのかよくわからないやばいとは思うマスの埋まり具合と現在位置でメモ化してもどう3日前に読んでい『競技プログラマー ハドブック(PDF) で紹介されていた枝刈り手法が使えそう壁にぶつかって左右に進路が分かれるときールがない方の進路に答えはないなんにせよ時間がなかった■精進GAtCoder TourF より低い青 diff なのを見たので問題を読んだ現在のマスが終着点だと仮定したときの想定楽しさを元にした BFS でできそう。提出 #54618901 (AC / 413 Byte / 480 ms)できたこんな腑抜けた G 問題を置かれると目の前の問題を解く以外のことを考えさせられてめんどうくさいんだよなあ■精進F 問題っぱりね「すること自体は難しくなさそうに見えてやりきるのはすごく難しい何をするかってぐねぐね左右に線を引いてト2行の帰り道では縦にぐねぐね線を引いてそれをフーマトして出力するがんばってやる! 提出 #54644107 (AC / 1676 Byte / 51 ms)右へ線を引く下に移動する左へ線を引くぐねぐねしながら左へ線を引くと関数を分けることで同時に1つのことだけを考えればいいようにした文字列化するのも行を出力する関数と行間を出力する関数に分けて同時に1つのことだけを考えるようにしたーたいへん縦横の偶奇と K の偶奇は調べなかった予め達成可否を判定することはせずに(できませんから!)やるべきことをやった結果ゴールにたどり着いているかどうかで判断をしたこれは ABC347-D の反省から(RE/WA を出した方では不可能なケースを最初に判定するようにしていた一方の AC 提出の方では操作をしたあとで結果が満足しているかどうかで出力を切り替えた要するに不可能なケースの判定に漏れがあったのだ)F 問題のジッジがザルだったらしいまああの大作の出力形式を整えて提出しただけで評価されてもいいよG 問題「現在のマスが終着点だと仮定したときの想定楽しさを元にした BFS でできそうについて書くまず待機するマスは必ずパスの末尾になる最適を目指すとそうなるパスがあって長さが決まっていて残りのターンを費やすのは報酬が最大のマスに決まっているそれがパスの途中にあるとするならそのマス以降のパスが蛇足だったということになる移動を省いてそのターンも待機に費やした方が良いだから待機マスは必ずパスの末尾になる▐あるマスに到着したときのことを考える関心事はそのマスを最終地点とした場合のスコアだから到着時点での残りターンを報酬に変換してスコアを比較するスコアがすでに記録されているスコアと同じか下回っている場合は探索を打ち切って良いなぜパスを伸ばす目的というのはより良い待機報酬を求めることにあるのだからあとから訪れていて残りターン数が少ない探索の枝はそれだけでビハイドを背負っているそれなのにパスに依存したスコアが余分に費やしたターン数に見劣りしているというのだからこれ以上の探索で先達より良いスコアを得る可能性はない▐もう全部書いた? 提出したあとになって問題があると不安になってでも実は問題がなかったことがあるBFStーン目の処理をしているときに隣接マスを t+1ーン目のキーに入れると同時に t+1ーン目の状態をその隣接マスに書き込んでいるこのあとさらに tーン目の処理を進めているときにっき t+1ーン目のキーに追加したマスが出てきてしまったらt+1ーン目の状態に基づいて tーン目の処理をすることになるのではないかと考えたでもチェス盤を考えるとわかるんだけどtーン目のキーと t+1ーン目のキーに同時に入るマスは存在しないのだったうまくできてるんだなあ今までそれを知らずにグリBFS を書いてたんだぜD 問題B の降順だと A をスキャンするだけでは済まないみたいなことを書いたけど具体的には二分探索と中間位置からの効率的な削除が必要だと平衡二分探索木みたいなものが必要だと思っていたけどそんなことはなかった昇順でも降順でも線形時間でト部分の O(NlogN) で解けるB の降順に処理を進める場合にはスタックを新しく1本用意する必要があるがそれだけでよかった。提出 #54693460 (AC / 降順)だけどあえて降順ソトをするより素直に昇順に処理をする方が簡単。提出 #54576260 (AC / 昇順)G 問題ダイクトラ法とのツイ()を読んだのでプライオリーを使う方法を考えたグリドが小さいから BFS でも大丈夫だと思ったし実際大丈夫だったけどBFS だと後追い更新が続くとターンが進んでもキーが短くならないんだよね。提出 #54698671 (AC / 1132 Byte / 124 ms / 58 ms)プライオリー由来の log が付いても 480 ms より速くなったっと意外しかも 124 ms というのはテトケース1つ目に特異的なタイムに見えるので実質的には2番目に遅い 58 ms が最悪タイムだと見ていいと思う爆速ーにはグリドのマスと同じ数だけ Kーン待機した場合のスコアを入れたールからスタト地点を目指す。移動するごとに決まったスコア(ール地点の待機報酬)を引き現在位置の報酬を足していく最初にスタト地点に到達したときのスコアが答え負の辺とかは知らないダイクトラ法を1回だけやっている


20240614() PS5 のシスムソトウェアアップデトについてQRドをスキャンするとアップデトの詳細がわかりますゃねーんだよまじでップデトする気が起こらない今日もそのまま電源を切った詳細が知られると不都合があるのかと勘ぐりたくなるほど愚かなやり方だと思うテキトで詳細な内容を提示するのが一番(従来はこうだった)内蔵ブラウザで表示できるようにリンクと URL を提示するのが二番エンコドされた記号をその他のデバイスで読み取らせるのは論外


20240613() UTF-8BOM について - 将棋プログラミング■ブコメWindowsはなぜBOMをつけたがるのかとあった自分も同じように感じていてUTF-8BOM を目障りに思っていたけどExcel で未だANSIエンコングが意味を持っていることを知ると「すべてのドページと共存しつつ互換性を破壊しないためのっともリーズナブルな手段なのかなと考えないではないCP932 以外のことはさっぱり知りませんけどもたぶんドページを UTF-8 (65001) に切り替えるのがユーザーの望みというわけではないのだと思う二者択一では満足できないもの


20240608() [AtCoder] 今日はトリープログラミングコンテ2024AtCoder Beginner Contest 357があったF 問題が解けず問題の理解があやふやで早解きも失敗し冴えない結果だった(確認はしていない)以下ふりかえりをASanitize Handsシミュレトして使用後の残量が負でない人数境界を探そうとすると1差で間違えそうで怖い手のない宇宙人が紛れていると話がややこしくなるんだけどそういう面倒がない 1H という制約だったBUppercase and Lowercaseやります。ASCII の6ビト目を数えるという猪口才な判定法CSierpinski carpet今日のつまずきはここから再帰関数でやろうかクラスでやろうか文字列操作でやろうかいつまでも迷っていた結局文字列配列を敷き詰めて拡張していく操作が簡単で短かったが15 分かけたD88888888まず勘違い与えられる N が整数型に収まらないサイズだと勘違いしていた文字列として各桁を扱わなければいけないのだと思って解いていた求めるものは初項公比項数が明らかな等比級数なのだけど項数が mod 998244353 だとサンプル3の答えが合わない。Integer Sequence Fair を解いたこと(20230327)が糧になっていないmod をそのまま指数にはできない繰り返し二乗法を自分で実装しなければいけないのかと思って N が何ビトになるのか確かめたら60トで足りるようだったなんだよ公式に3数を当てはめるだけのことに 20 分かけたEReachability in Functional Graphこれも勘違いがひどかったN 頂点 N 辺だというからっかが1つのなもりグラフなのだと思って解き始めたのだけどこのグラフは連結でも単純でもなかったサンプル1に言及があったのだけど自己辺があるそれではと複数のループとループに繋がる毛が生えているグラフを想像してサイクルと直線を検出する関数を書き始めたのだけどサンプルの3が合わない枝毛の可能性を考慮していなかったせい問題文の最後にわざわ特にu=v の時は常に到達可能ですと書いてあるのも読み飛ばしていてカウト漏れがあったしもう散々だったおよそ 40 分かけて変な関数を書いた>提出 #54372312 (AC / 316 Byte / 227 ms)順方向と逆方向の DFS を2回やるらしい強連結成分分解をそらで書くことがまだできないので変な関数を発明しがち出次数がすべて1だという条件があるから強連結成分分解はオーバーキルなのだと思う(だから変な関数で解ける)自分のすべての提出C 問題再帰バージョン。提出 #54407583 (AC / 276 Byte / 138 ms)結局のところ実装の方針に迷っていたというのはどの方針にしろ実装を最後まで見通せなかったために二の足を踏んでいたということなのだろう実装力が足りない■級数という言葉についてっと検索したら級数というと普通は無限項の和を表すみたい特定の範囲を除いて0と定義することで有限個の和を表すこともできてそうでないことを示すために無限級数という言葉も使われるけど基本的に無限個の和なんだって級数(ja.wikipedia.org)そうか等比数列の和って言わないとだめなんったらしいなあっきり並べたものが数列で並べて足すものが級数なんだと思ってた


20240607() [AtCoder] 生成AIの台頭に伴うABCにおけるルール変更について - AtCoder■なんの補完も整形も行わないテキトエタしか使わない自分には関係ないかなと思っていたAtCoderの開催中のコンテトの問題として発信されている情報の全部または一部をトウェアに入力として与える行為を禁止します。問題文をコピーした文章・スクリーンシトなどが該当します。提出するソースコドを書くためのエタもこの制限に該当しまと書いてあって完全には無関係ではなかったタも例外ではなかった(想定は VSCode みたいな Copilot 付き高機能エタらしいけど)とはいえ自然言語の問題文をコピペする機会はこれまでなかった定数や出力用文字列問題文で与えられる固有の整数や固有名詞などの文字列は任意の場合においてコピーが許されます。998244353などの問題文で与えられる数値TakahashiAokiなどの文字列等Mondayなどの曜日や問題文で与えられる数列などは許可されまと例外として許可されていた自分は自分の注意力や指や目を全く信じていないので、Aoki と4文字タイプするのも避けてコピペしたいタイプなのであって許可されていて良かった最近はもう積み重なった慣例を疑う理由もないのでグリド問題で ox をコピペするのはやめてしまったけど字形と文字コドの繋がりって不確かだよねGitHub やブログに貼り付けられたソースコド片において円マークに見えるものが 0x5C ではなく 0xA5ったせいで壊れていたケースを複数回見かけているタイポを避けるためにコピペしたいし見た目ではなく文字コドに基づいて入力するためにもコピペしたい話がそれた他に注意が必要な点はなかった


20240606() 【悲報】日本人の民度ガチで悪くなっていた… : 暇人\(^o^)/速報 - ライドアブログ■これのコメト欄ハザドたいて路肩に一時停車するだけとあって実際そういう対応を見かけることは多いのだけど自分はそういう対応を教習所で習った覚えがないハザドをつけるのは害がないと思うだけどつけろと習った覚えはない交差点には進入できないだから交差点に進入しないために停車することはあると思うだけど直線で路肩に寄って停止するのはあまり良くない対応だと思っているなぜ車というのは横に寄せるためにも前進しなければいけないのであってたとえば救急車が後方から接近しているときに前の方にある車がそそくさと停止してしまうと後ろにいけばいくほど前進余地が少なくなって横に寄せることができなくなるウチの県は1号線であっても片側1車線なので救急車もその周辺もにっちもさっちもいかなくなる緊急車(緊急自動車が近づいてきたときの道の譲り方や進行妨害した場合の罰則 | クルマ情報サトーGAZOO.com「緊急車両 対応で検索して出てきたこのページ3.緊急車両に対する道路交通法での義務に条文の抜粋がある前段が交差点付近の対応で左側に(場合によっては右側に)寄せて一時停止せよと書いてある後段がそれ以外の場所での対応で左に(もしくは前段同様右に)寄せて譲れと書いてある次節(4項目目)記事本文には停車せよと書いてあるからあえて条文部分を参考にした「譲るを日常語として理解してはいけない可能性? でも前段との比較によっても一時停止までは求められていないと判断できるもちろんしてはいけないとも書かれていないのだけどあまりいい考えじゃないんじゃないかなあというのが自分の意見前が止まれば止まるしかないけど寄せて減速はしても率先して止まりはしないというのが自分の対応■左に寄せるときはまずミラーを見て二輪を挟まないように注意します。


20240602() [AtCoder] 今日は AtCoder Regular Contest 179 があった結果が見たいような見たくないような気がするけどどちらにしろまだ出ていないだろうからまずはふりかえりAPartitionサンプル1の出力例が壊れていましたね解説文と食い違っていたサンプルの2がなんで No になるのか考え込んでしまったYes だよね(Yi<K かつ Yj​≥K) ならば i<j が成り立つという型の命題は前提が成り立たないときは常に真だよね誰か質問しないかなと考えていたそのうちに問題文を何回目かに読み返していたときに気がついたんだけど累積和の初項が必ず0だからその時点で K 以上の値が出現してしまっている場合があるのだねK が0以下の場合とそれ以外で場合分ここではあっさり書いたけど境界値が 0 なのか -1 なのか 1 なのかでもじっくり考え込んでしまった基本的には Yes でソト列が答えになる判断が分かれるときは正の和と負の和の絶対値の差と K を比較するここでも不等号にイコールが付くかどうかをじっくり考えてしまったなんなら最初に戻って場合分けの条件から考え直しているこれが自分の脳みそに収まるぎりぎりのサイズの問題です。BBetween B and Bある文字が要求されているいないの状態が 1<<Mってこれを N 文字分繰り返す DP をするのだと思った実は最後の文字が何であったかを区別しようとしていてそうすると1億ステップの処理になって TLE なのではないかと思ったけど区別しないなら 1000 万なので間に合いそうどちらにしろ数字合わせができなくて TLE かどうか以前の問題だったCBeware of Overflow個別の値の絶対値が R 以下ですよ値の合計の絶対値も R 以下ですよ二項間の比較と加算を駆使してどの瞬間どの値も絶対値が R を超えないようにうまい順番で全体を1つの値にまとめましょうねという問題最初はソトしてから先頭と末尾の加算を繰り返せばいいかと思ったト列を真ん中で折り返して加算するので1回のイテレーションで全長がおよそ半分になるだいたい答えは合っていたけど3ケースだけ WAった(#54171399)どういうケースで良くないかというと、-R,-R,-R,2,2,R-1,R-1,R-1 みたいな場合? R=3 だとすると 2+2 をしてはいけない改良版では加算した結果を二分探索で適切な位置に挿入することで常にソト済みの状態を保ちながら最大値と最小値の加算を繰り返すことにした。提出 #54175146 (AC / 442 Byte / 177 ms)■水パフォで喜べないって悲しいねわざわざ確かめないけどね自分の想像では ARCABCABCARC と下げが続いているDPortable GateRuby で挑戦している人がいたのでまずは問題を読んでみた全方位木 DP? ゲトを置く場合と置かない場合のコトを積み上げていくのかと思って実装を始めたけどどうもそれではいけない始点に帰ってくる必要がないのだ最後に選んだ辺へは行きっぱなしでいいそうするとトを置かずに帰還する場合のコトを置いて帰還する場合のコ帰還しない場合のコ(※ゲトを置く置かないは呼び出し元に影響しないので置けばよい)の3つを考える必要があるのかなと考えたところでギブアップ知力を振り絞るためには頭の良さだけではダメで外国で冬の海に飛び込めるくらいの体力が必要らしいですよ(もちろんそんな体力もエネルギーもないのでさっさと投げ出しちゃいます)■通った!!! 提出 #54283484 (AC / 1521 Byte / 1758 ms)っくりマークを3つ付けてもいいでしょうたいへんだった寝る前に数時間がかりで慎重にコングをしたらっとしたシンタックスエラーを2つ直しただけでサンプルが通ってあとのミスは親方向の深さを計算するときに +1 するのを忘れていたことだけだった(37 行目と 50 行目子供から見て兄弟は最も近くに見えて2親等だという話)結局考えるべきは先に挙げた3つに加えて(トを使わないで)帰還する場合と帰還しない場合の差分として最も遠い子孫との距離を記録したこの問題ならではのフックがありました全方位木 DP の手順として全体から子を引いてそれを親方向のパラメータとして子に与える必要があるんだけどパラメータの計算に最大値(最小値)を使っている部分があるつまり複数の子があるときに1つの子については帰還する必要がないけど他の子についてはすべてを黒に塗ったあとで戻ってくる必要があってその選択に最大値(最小値)を使っているんだけど子の影響を全体から差し引くときに最大値(最小値)が利用できなくなる場合がある(その子がまさしく最大値(最小値)った場合)こういうときップ2戦略は過去2回の経験がある(20240302)どうですかねっとシンプルに解ける考え方があるんですかね選び方次第でパラメータが減らせる可能性はあるかな全方位木 DP というだけでたいへんなのにそれに輪をかけてたいへんだったパラメータが4つあってそのうち2つップ2戦略を使った最後に補足トを使う使わないを辺ごとに独立に選んでいい理由はトを使わずに網羅して帰還する辺をトを使って網羅して帰還する辺より先に選んだことにすればいいから(そして最後が帰還しない辺)B 問題。提出 #54413597 (AC / 433 Byte / 1544 ms)すでに散々悩んだあとで頭の中が整理されていたからかフツーに普通の DPった日記「ある文字が要求されているいないの状態が 1<<Mってこれを N 文字分繰り返す DP をするのだと思ったと書いたことは忘れていてブロックされている文字にビトを立てる DP をしたそれで良かったけれど時間が厳しい3重ループになるのだけどN のループの中で 1<<M のループの中で M のループを回すとコドテトで 10 秒弱かかった制限は特に長めでもない2秒ここで ABC356-D Masked Popcount の解法のひとつトごとに 01 の出現サイクルを利用するものを思い出したトごとに 0 または 1 だとわかっている数についてだけループを回すなら3重ループの最奧でビトが立っているかどうかの判定をしなくて済むしープの回数も半分になるそのためにはループの順番を変えてN のループの中で M のループの中で 1<<M のループを回す。遷移はビト演算が2つある文字を置いた結果その文字自身をブロックしそののちいくつかの文字のブロックを解除する■同じく B 問題。提出 #54414039 (AC / 796 Byte / 1628 ms)Ruby による B 問題へのすべての提出を見ると Akiyah さんが 2047 msAC まで一番近づいていた>#54319004お楽しみを奪ってしまったとしたら申し訳ないのだけど速くなりそうな部分があったのでそこを修正したものが冒頭の提出具体的には ns.sum{|n| dp[n] }dp.values_at(*ns).sum に変更したら 20 % くらい速くなって AC になったインタープリタ型の言語はできるだけ短い指示で多くの仕事をコンパイル済みのネイブコドにやってもらうのが良いちなみに TLE を避ける工夫は自分のものとは異なっていて1<<M 通りの遷移先をビト演算で N×M 回求める代わりに前計算をして遷移先ごとに遷移元の集合を用意しているそれがさっき出てきた nsそういう準備があったからこそ dp.values_at(*ns).sum という効率的な遷移を書くことができた遷移を1行で済ませることができていたD 問題。解説を読むと読むのもたいへんなので8割読み飛ばしちゃうんだけど移動コトの上限は 2(N-1) で固定だからトを使って帰還コトをどれだけ節約できるかだよと書いてある……ような気がする。提出 #54485687 (AC / 989 Byte / 1765 ms)パラメータが1つ減って3つになった解説の最後にリトされている3項目に3つのパラメータを対応付けるなら順番に RG+LG になるのではないかな最後が一致しているのでヨシ!


20240601() [AtCoder] 今日は AtCoder Beginner Contest 356 があった。自分のすべての提出結果は見ないようにしつつふりかえりだASubsegment Reverse愚直に配列を操作してもいいし区間を3つに分けてもいいBNutrientsArray#transpose が便利CKeys愚直にやります。2**15*100 は数百万なので間に合う問題文与えられるテト結果が誤っており上記の条件を満たす組み合わせが存在しない場合もあります。その場合は 0 通りと解答してくださいの意味がよくわからなかった信頼できない入力が混じっていてそれを見抜いて何らかの対処が求められているのかと思った実際は単純に矛盾するテトによって答えが0通りの場合があるよということを言っているだけだったたしかに複数のテトを照合した結果矛盾が生じて答えが存在しない場合ゃあ個々のテトにおい「開いた(開くはずがない)「開かなかった(開かないはずがない)という結果をどう扱えばいいかという疑問が生じるそれは誤りであるという断り書きだったDMasked Popcountかつてよく見られた数え上げ問題苦手だよでも精進によってなんとなくの型みたいなものは持っている上限が N で与えられてるのがやっかいなんだよねたとえば N=2**60 ならこれは主客転倒で寄与を簡単に数えられるゃあどのようにしてそういう状況を作るかというと与えられた N のビトのうち最も左にあって最初に倒されるビトを決め打つことによって N を複数の区間に分割するN のプリックスと自由に {0,1} が選べるサックスとで構成される区間について問題を解くたとえば N=0b10101 ならプリックスは1のビトの数と同じ次の3つ(0b101000b100xx0b0xxxx) もちろん1つもビトを倒さない場合も忘れないEMax/Minよくわからない問題N の上限は 20これは O(N) もしくは O(NlogN) が解法となるよくある制約でN の制約としてはほぼ上限そして A が取り得る値が 100 万以下これは N と比較すると大きい数字だけど処理すべき区間が 100 万以下であってそれ以上は考えなくてもいいと思うとそんなに大きい数字には思えない不思議結局これは調和級数の上限がどうのという問題だったんだろう特別な道具を使わずに配列を操作すると決めたあとでも答えを合わせるのに苦労して結局1時間近くかけてしまったやるべきことはひと目でわかるんですよすべての組み合わせについて足し合わせるに当たって予めソトして AiAj の大小関係を固定してしまえば考えるべきは分子が分母の1倍か2倍か3倍か……時間が厳しいので(そこが問われている問題なので)同じ値はまとめて計算しますよそうするとどんな入力が嫌かというと小さい数字が順番に並んでると処理をまとめることができず区間を大きくスキップして処理することもできないのが困るなとだけどね100 番目1000 番目の値はすでに十分大きいわけです。100 万割る 100 は1万だし100 万割る 10001000 なので個々の処理量は無に等しいもちろん1万が1万集まれば馬鹿にならないんだけど全体で見ても処理可能な範囲に収まることは知っている名前は出て来なかったけど高3の演習問題でいつの間にか不等号を証明させられていたような気がするFDistance Component Size Query解けなかったセグメト木とか平方分割とかうまく区間を分割して効率良く数えられないかと考えたけどできそうでできなかったでもできるのかなと思ってる自分にはできないけどK=0K=1それと K がすごく大きいときでだいぶ様子が違ってくるなとも思ったでもゃあ K=1 の場合に限れば問題が解けるかというとそうでもなかったD 問題桁ごとにサイクルを考えるという解法を仕入れてきたLSB から見ていくとサイクルは28と倍々になっていくその中身だけど前半が0で後半が1という単純なものだから 0 から N までの N+1 個の数をサイクルと半端に分けて1の数を数えるのも簡単。提出 #54162917 (AC / 165 Byte / 42 ms)この考え方だとずるいぐらいに実装が簡単だった自分は自分の考え方で実装したとき式を間違えて1回 WA を出してるからね>提出 #54107427 (WA)


20240525() [AtCoder] 今日は東京海上日動プログラミングコンテ2024AtCoder Beginner Contest 355がなかったいいねそんなものはなかっただから残念な結果も存在しない少なくとも自分は確認していないだけれども問題はあり解けた問題もあるのでふりかえりは行うAWho Ate the Cake?Ruby の配列は集合演算も行えて便利BPiano 2A 数列と B 数列をマージしてソトしてA 数列由来の要素が連続しているかどう愚直に線形探索をしても許される制約どうとでもやるCBingo 21列が最大 2000 要素縦横斜めが最大 4002()ありそれぞれに対して 2000 要素のスキャンを行ってもおよそ 800 万なので許されるビンゴカドに何ターン目に呼ばれるかを書き込んで()ごとに最大値を読み取る呼ばれない番号もあるのでそれはテーに T より大きい値にするRuby800 万の処理はちっと不安だったのでーン数を知るのに Hash を使う代わりに Array を使うようにした他所で読んだけども制約がひと桁以上大きければーンに沿ってビンゴゲームを進行しビンゴが成立したかどうかの判定を行列対角ごとに用意したカウンターで行うしかなかったDIntersecting Intervalsタイムラインに沿って入りと出を管理して現在を中に含んでいる区間の数を数える数がわかれば組み合わせが数えられるサンプルをよく読めば書いてあったけど閉区間なのである値で隣り合っている2つの区間は共通部分を持つ同時に起こる入りと出の処理順に注意するEGuess the SumABC349-D Divide Interval の記憶も新しいので(20240413)今度はセグメト木をすぐにイメージすることができたでも解けなかったクエリ回数を最小化しないといけないそのためには与えられた区間を2冪に分割するかもしくは与えられた区間を内包する2冪から区間外を除くかどちらを選ぶ場合も考えられるそれをうまく整理できなかった散々悩んだ末にまずは DFS 関数を2つ書いた1つは区間を受け取ってクエリ回数を数える関数でもうひとつはクエリを実際に実行する関数積み上げるのがいいか取り除くのがいいかは2冪の幅を大きめと小さめの2種類特定して再帰呼び出しでシミュレトして比較選択したこの2パターンでいいということが全然見えなかった「整理できなかったとはそういうことその結果ひと通りの実装は済んでもデバッグの時間がとれないまま時間切れになった穴あきになっていた PAST の問題(魚釣り)の精進をしてから(ふてくされてたんだよ)ドの整理とデバッグをした再帰関数はクエリ配列を返すもの1つだけに統合された(#53902777)最短のクエリ配列を選んで最後にまとめて実際のクエリに変換するクエリ配列を使うものも使われないものも区別せず生成破棄を繰り返すのは無駄が多いけどそれでも許される制約なのだから AC のためにはこだわっていられないFMST Query解けてないよMST というのは辺のコトの昇順に UnionFind をするやり方しか知らないそれでクエリに答えられるか考えてみたけどできなかった辺のコトが 10 通りの値しかとらないところがクサいつまりトの更新機会が限られるのではないグラフは最初は木でクエリのたびに辺が増えて入り組んでいくけど実は常に木の形を維持していていいのではないそして木を維持するのにちっとばかしコトをかけても総体としてコトの和は実行可能な範囲におさまるのではない新しい辺を追加しても木の形を維持するというのは2頂点間のコト最大の辺を特定して切断するということそんなの逐次的に効率的にできないよUnionFind の経路圧縮的な手抜き手段がないと部分木のすべての頂点について親子関係を更新することになってやってられないよ自分のすべての提出成績証は確認しませんUnionFind10 個使うんだという解法の核心を某所 publish.obsidian.md/naoya/ で読んだのでそれでどうやって答えが出せるのかをお風呂で考えてきたUnionFind ではコト1のグラフト1から2のグラフト1から3のグラフというような 10 種類のグラフを管理するあとはまあやりま提出 #53927502 (AC / 576 Byte / 1512 ms)当日はト1のグラフト2のグラフみたいに分けることは考えていた「それでクエリに答えられるか考えてみたけどできなかったあとちっとが足りないんだよなあやるだけも門前払いも退屈なのでこれはちょうどいい難易度AC を出したことなので安心してネタバレを読みに行ったらABC355 振り返りなんか UnionFind の使い方が違うRuby の中ではひときわ速い fumta さんの提出 #53927847 が同じ解法だと思うんだけどわかりません自分の解法は最初に N-1 本の辺のコトの合計を記憶しておいて新しい辺が採用されたらそのコw を足しそれまでに採用されていたが不要になった辺のコトを w+1..10 の範囲で探して引くというもの単純明快でししかもト1の辺を使うグラフト1から2の辺を使うグラフ……という 10 種類のグラフを維持管理する処理と辺を追加したことで不要になった辺のコトを特定する処理が一体となっているところが美しいと思うんだこれは解答というより問題の力だとは思うけどもE 問題kotatsugame さんの動画(【競技プログラミング】ABC355【実況】)でグラフとしての見かたを知ったので新規に実装して提出した>#53993734 (AC / 1045 Byte / 402 ms)変数の取り違えで RE を出しoff-by-one エラーで WA を出しデバッグ版を提出して WA を出したあとでの ACったっぱり難しいねこの問題ミスのしやすさも問題の難しさのうちだとすればねっていることは辺が陽に与えられないだけの BFSグリド問題みたいなもんだC 問題行や列をスキャンする O(N^2) 解が 455 ms (#53855978)ったところカウンターを使う O(T) 解が 132 ms (#53993977)った制約がちっと変則的で、1Tmin(N^2,200000) かつ 2N2000 なのでT の上限が 20 万なのに対して N^2 の上限が 400N^2 解を許容するためにあえて制約の桁を減らしていることが窺えるC 問題だしねまんまと甘えさせてもらいました


20240522() 驚異(ョウイ)脅威(ョウイ)が区別されていないと感じる文章が少なくない自分は驚異=wonder脅威=threat と結びつけることで区別しているこの対応自体が Wonders of the World (en.wikipedia.org) の訳は世界の七不思議 (ja.wikipedia.org)ゃないよね七大驚異だよねという認識から来ている細かいことをいうとこの用例での Wonder は自然や人が作り出した絶景(驚嘆すべき構造物)という限定された意味を持つらしいので驚異では不十分なのだけどそこの事情は英語でも変わらないっぽい? つまりwonder が特にそういう限定された意味を持つというわけではなく限定された意味を持たされた用例が存在しているだけなのだろうということ元はギリシャ語にあ「眺めるべきものを意味する言葉だったがラテン語を経由するときに意味が足りなくなり英語を経由したときに意味が転んでしまったみたいな経緯が日本語のキペアに書いてある人間は概念を直接やりとりすることができず概念に与えた恣意的な輪郭である言葉をやりとりしているがゆえに異言語間ではずれが生じるみたいな異なる人間と人間のあいだに共通概念が存在できるのかどうかもわかりませんともかく脅威に対しても wonder に対しても驚異って単語が出て来ないせいで誤ってしまうのは認知度が低すぎるので意識して脅威≠驚異=wonder の関連付けを行っているという話


20240518() [AtCoder] 今日はパナソニックグループ プログラミングコンテ2024ABC354があった8時半をまわってから2回もハドウェアエラーでブルースクリーンが出てRated で参加するのをためらったけどコンテト中に再起動が必要になることはなくて助かったていうか再起動してもダメなんだよトデバイスが見つからないって出るつまり起動中にいつの間にか C ドライブを見失っていてそれがスリープ移行中や復帰中に発覚するとブルースクリーンが出るそれ以外のタイミングだと IO 待ちで一部のプログラムがフリーズするのみで何もできなくなるまでにわずかの猶予があるいずれにしろ再起動しても C ドライブを含む SSD は見つからないままSATAーブルを抜き差ししてお茶を濁すということを1年以上前から続けている数回のブルースクリーンでパョンが飛んでいた FAT32 と比べて一度も壊れたことがない NTFS の堅牢さは素晴らしいもちろんァイルシスムが壊れていないからといって個々のファイルが壊れないわけではないのだけどという話はもういいや結果がまだなのでふりかえりからAExponential Plantやります。朝と夜の区別が地味にやっかい脳のリソースが奪われるサンプルの解説文に何を判断基準にするか何を答えるかが書いてあるのでそれを素直にコドにする方が早かったBAtCoder Janken 2やります。A 問題より素直CAtCoder Magics強さの順もしくはコトの順に処理をする今見ているカドを基準にして捨てるカドを捨ててから追加するスラド最小値の要領DAtCoder Wallpaper前回の F 問題 Tile Distance と似た見た目の図があるけれどD 問題ということで素直に計算できるのかなと期待する2倍した面積を答えるのだから三角形の数を数えればよいX 軸方向の周期は4で Y 軸方向の周期は2だから単位面積当たり計8通りのパターンがあるあとはそれぞれの数を数える自分は頭より先に手が動くタイプなのでスマトな式を考え出すよりも case 式で場合分けをいっぱい書いた場合分けの数だけバグが潜む場所が増えるのでリスキーではあるが考えても答えが出て来ないリスクも無視できないERemove Pairs先に F 問題までひと通り目を通してから実装を始めることにしている泥沼にはまりかねない D 問題に対して E 問題は素直にメモ化再帰をするだけだと思ったので先にこちらを解いた6分半で書いた最初の提出が TLEそこからペナル込みで 17 分余計にかかったのが残念ABC349-E Weighted Tic-Tac-Toe が解けたら解けるFUseless for LIS左右から LIS をやって自分の左の増加列と右の増加列の長さ+1が自分を含む増加列の長さこれが最長と一致しているかを確かめるLIS のやり方を忘れていて思い出しながらの実装だったでもLIS というのはトランプ挿入ソを解いていたこのとき(20200602p01)名前も実装方法も知らないで解法を考え出した経緯があるので思い出せないはずがない忘れてもでっちあげられる■日記を書いていたら結果が出た。コンテト成績証自分のすべての提出1895 の青パフォで +33トは 1631 () になりました初めて青色になりましたここ3回の ABCARCABC+52+24+33 というのはできすぎた結果なのですぐに水に落ちた後で水青の反復ができるとも思ってないよ