/ 最近 .rdf 追記 編集 設定 本棚

脳log[20241122]



2024年11月22日 (金) [AtCoder] 今日は金曜日だけど AtCoder Beginner Contest 381 があった。F 問題はたぶん青 diff かなあ。それが今日の1問だったら解けると思うんだけど、A から F までの6問のうちの1問だと、まあ無理。11月11日がポッキーの日だったのかな、知らないけど。で、今日はわんわんにゃんにゃんの日なのかな、知らないけど。■A 問題 11/22 String。問題文が難しすぎます。例を見て把握してから理解に間違いがないかを定義に戻って確かめるのが良いと思う。正しい 11/22 文字列を作って入力と比較した。■B 問題 1122 String。こちらの問題文(というか式)はやや読みやすかった。文字の uniq を取って倍加して入力と比較した。■C 問題 11/22 Substring。前後の 11/22 文字列がオーバーラップすることはないので、正規表現で 1*/2* を拾い出してからスラッシュの位置を探して計算した。なんでか 10 分かかっている。■D 問題 1122 Substring。やることが多いよね。まずペアの列を複数切り出したんだけど、同じ値が3つ以上連続している場合に注意が必要。その部分でペアの列を切って新しい列を始めるのだけど、どちらの列にもペアを登録することになる。たとえば 1 1 2 2 2 3 3 が与えられたとき、得られるペアの列2つは 1 22 3 になる(同じ数字の繰り返しは省略)。2 と 2 のペアが前後のどちらの列にも属している。その次にペアの列に対して同じ値を含まない最長の範囲を求める。現在の値を右端とするとき左端がどこまで伸ばせるかという DP をした。最初は値ごとに直前の位置を記憶しておくだけでいいかと思ったけど、そうではないのだな。たとえばペアの列が 1 2 3 2 1 だったとき、右側の 1 から左側の 1 の直前までを切り出すと 2 3 2 1 になって違法。直前の位置の最大値を1つ記録しておく必要があった。RE/WA を1回出しつつ 26 分かけた。難しいし妥当だと思う。■E 問題 11/22 Subsequence。25 点だけ配点が上の F 問題に先に取り組んだけど追い返されてきた。スラッシュの位置にそのスラッシュを中心とする 11/22 文字列の長さを記録しておけば、セグメント木の区間クエリで答えが出せると思ってしばらく無駄な時間を費やしていた。何を勘違いしていたか。「(連続とは限らない) 部分列」で 11/22 文字列を構成するということは、スラッシュとスラッシュで 11/22 文字列が区切られるわけではない、ということがわかっていなかった。スラッシュを飛ばしてその向こうまで 1 なり 2 なりの文字を拾い出して構わない。ということを理解すると、スラッシュの位置ごとに左に1がいくつあって、右に2がいくつあるかということだけが重要。クエリで範囲が与えられたとき、どのスラッシュにとっても同じ数だけ1と2の利用が制限される。範囲内のスラッシュに対して二分探索で左右の1と2の均衡点を探る。2つの均衡点(m0, m1)を取り違えるタイポで WA を1回出しつつほぼ1時間かけた。終了5分前に WA が出たときは目の前が真っ暗になる思いがしたけど、上から読み直して運良く見つけられた。F 問題を考えていた時間とセグメント木を使っていた時間が無駄になった。3、40 分で解きたかったね。■F 問題 1122 Subsequence。A の値域が 20 以下という制約からどういう DP がやれるか考えてしまって考えが深まらなかった。D 問題でやった DP と、E 問題で気がついた「都合の悪い要素を飛ばして伸ばせる」という点がヒントになると思うんだけど、未だまとまらず。現在の要素を右端として直前の同値の要素からどれだけ左に伸ばせるかを考えたいんだけど、それをするのに何をキーにして状態を記録するのかが不明。■値が 20 種類しかないということは、最長でも 20 までしか伸ばせないということだ。ということは? 何ができる? 長さが問題にならないなら幅が 1<<20 でも問題ないということで、bit DP か?■五線譜ならぬ 20 線譜があって、隣接する同値の2要素を繋いだ区間が線上に乗っていて、20 本の線からオーバーラップのない区間を選んで繋ぐ。同じ線からは1つの区間だけ。