パ研合宿2021 第2日「SpeedRun」A~HとJをAC。その後Kを解けず終了。
— titia (@titia_til) March 28, 2022
E 直前二つと違う数字を使う
F 実験したら(1,N,1,N-1,1,N-2)と言われた
G bit DP
H 各条件について、最小・最大のNを二分探索
J A_iより小さい/一致/より大きいで分けてDP
K 木のトポロジカルソートの個数の数え上げになったが……
titiaのノート
2025年12月7日日曜日
パ研合宿2021 第2日「SpeedRun」
A~HとJで九完。
コンテスト後のツイート
解説AC。
連結でさえあればどのようなxとyに対しても、「他を変えずに、xとyを入れ替える」という操作が可能だと気付けるかがポイント。単純に行って帰って……と交換したら良さそうだが、自己ループなどがあると壊れるのが難しい。
括弧列は根付き木と捉えることができる!
それさえ知っていれば、木DPと気付くのは難しくない。
2025年12月2日火曜日
Educational Codeforces Round 185 (Rated for Div. 2)
Cまで三完。途中ややいい加減にやってしまったところはあるけれど、Eは真面目に考えたのだけど解けなかった。
E. Binary Strings and Blocks
包除原理を使う問題にしか思えなかったけど、違ったようでびっくり。
正しい解法は、DPでした。
最後に色が変わった箇所がiとしたときの塗り方の個数をDP[i]とすると、[l,r]の条件から、次にどこまでで色が変わらなくてはいけないのか? が分かるので、そこまで一気に(セグ木などを使い)加算していく。
言われてみれば自然なDPだけど、1マス1マス決めていくことしか考えていなかったせいか、全く思いつかなかった。
何個条件に違反しているか? という包除原理を考えていたけど、これだと、ある区間と別の区間に交わりがあったとき、両方に違反しているか? などを上手く数えられないので上手くいかないのですね。
2025年12月1日月曜日
AtCoder Regular Contest 211 (Div. 2)
AB二完で青に落ちる。ABCで黄色に上がった次の日のARC/AGCって悪い成績をとりがちなのかも。
コンテスト後のツイート
C maxの数字をどう使うか、って話だと思うけどまとめられず。
— titia (@titia_til) November 30, 2025
D 橋は一通りに決まるのでそこで矛盾したらダメ。あとは、全頂点を通る一筆書きができればいけそう、とか考えていたが分からず。
C - Forest
コンテスト後半に最大値が大事だと気付いたとき、まず思いついた解法が正解だった(証明は、公式解説を見るまで分からなかったが)。
ダメな気がして棄却してしまったが、反例が見つかったわけじゃないし実装すべきだった。
こういうのが反例になるだろう、と考えていたものはあったが、具体的に構築できたわけじゃないかった。どちらかというと、それが反例だとすると実装が複雑になりそうでおかしいと思うべきだった。左右から最大値をその場所へ寄せていけるか? みたいなことがキーになりそうだと思って実装していたけど、そう考えたときすっきりした条件にまとまらなかったのもおかしい。
複雑なことを考える前にまず実装して投げてみるべきだった。既にBでペナルティを出しているわけで、ペナルティの個数を気にするような状況ではない。それっぽい解法が思いついたら投げて、ACかWAか様子を見るべき状況だったはず。
普段、余裕があるときなら確信がなくても実装して一度投げていると思うのに、なぜしなかったのか。
焦り過ぎていた。
D - Michishirube
DFSというキーワードをヒントにAC。
コンテスト中は、橋で分解した後どうしようか、と考えていた。コンテスト終了直後にDFSすればいいのでは? と浮かんだけど後の祭りだし、それも、橋で分解した後DFSすると良いかも? と思った感じなので、橋を使わずにDFSすることに思いいたるまでにはまだ時間がかかったと思う。
ただ、こういう問題でDFSを考えるのは定石なのだから、考えてみなくてはダメだった。
そもそも、LOWLINKが必要と思っている時点で筋が悪い。ARCでLOWLINKを使う問題は出ないのでは?(出る可能性はあるけど、そこそこ低いはず) と考えても良かった。
2025年11月28日金曜日
estie プログラミングコンテスト2025 (AtCoder Regular Contest 210)
Cまで三完。Aが難しかった。
コンテスト後のツイート
B A,Bをまとめて、上位N/2個と下位N/2個の和をBITで求める。実装で苦戦。
— titia (@titia_til) November 16, 2025
C 上の桁に貸して計算。下の桁に戻すときは、貸した値以下だけ戻せる。
E - Subset Sum Gaps
解説放送を見てAC。
かなりシンプルな解法だった。
部分和を考えるのだから、今までの和を全てもって、そこに一つずつ追加していくという考え方は自然。
それを区間(区間の最小値・最大値・個数を持つ)で行えば良かった。計算量は分からなくても、1.01倍というのを生かそうと思えば区間を考えようと思うのは自然だろう。
1.01倍というのを見て数学問っぽいかと思い避けてしまったけど、Dよりは可能性があったか?
2025年11月27日木曜日
AtCoder Beginner Contest 426
Fまで六完。
コンテスト後のツイート
F 区間加算、区間minの遅延セグ木とBITを使う。区間内でk未満のところがあれば、そこを答えに加え、セグ木で+1<<63し、BITで+1(加算する箇所は高々N個)する。それ以外はkなので掛け算で値は求まる。一回TLEしたのは、何度も+1<<63して64bit型整数を超えたため。そこを修正したら2s切りました。
— titia (@titia_til) October 4, 2025
G - Range Knapsack Query
解説放送を見てAC。
自力で思いつくのは難しいが、知ってしまえば単純な内容。
分割統治で答えを求める……と言われてもなぜそれで計算量が落ちるのかピンと来なかったが、noshiさんによるDisjoint Sparse Tableの図を見ると分かりやすかった。
これをデータ構造として持つのがDisjoint Sparse Tableですね。今回はクエリ先読みできるので分割統治で、この図のようなことをやる(上のノードから下のノードへ分割し、潜っていく)とOK。
なお、実装にも苦戦しました。分割統治したデータを持とうとするとMLEしたのが一つ。また、クエリでl=rの場合での場合分けが必要で、そこにもなかなか気付きませんでした。
2025年11月25日火曜日
ユニークビジョンプログラミングコンテスト2025 秋(AtCoder Beginner Contest 425)
Fまで六完。
Gも考察の方向性は間違っていなかった模様。
コンテスト後のツイート
F bit DP。重複をなくしたいので同じ文字が並ぶときはTに現れるindexが大きい方が後に現れるようにする。そのために、今の文字列に対してどこに入れるかを考えて尺取り法を使う。PyPyでsample3をコードテストでやったら2450msだったので投げたがTLE。ChatGPTにC++に翻訳してもらった。
— titia (@titia_til) September 27, 2025
G - Sum of Min of XOR
解説放送を見てAC。
コンテスト中は、Binary Trieを使うことを思い付いていたらしいが、今考えていたときは思い付けなかった。
しかし、Binary Trieを使うと思いつけたのなら、Binary Trieに区間を入れていくだけなのでそれほど難しくない気がするのだけれど、コンテスト時はどうして分からなかったのだろう?
解説を見た今だと、考察も必要なアルゴリズムもそこまで難しくないため、解けなきゃいけない問題に見える。
2025年11月24日月曜日
AtCoder Beginner Contest 433
Fまで六完。
コンテスト後のツイート
E 大きい数字から埋める。後で邪魔しなそうな、既に使ってある場所から埋めて行く。自分の実装は計算量怪しい。
— titia (@titia_til) November 22, 2025
F 左にある1の個数と右にある2の個数だけで答えは決まるが、二項係数の和になりそう。→実験したら二項係数一個になった!
G suffix arrayを使って再帰で解けそうなんだけどまとめられず。
G - Substring Game
コンテスト中は、Suffix arrayやLCP配列を使う、というところは合っていたけど、木になるということは理解していなかった。再帰で解けると思っているんだから、木構造になると分かってはいたはずではあるけれど……。
解説放送を見てSuffix treeを使ってAC。
Suffix treeは初めて書いたけれど、Suffix array・LCP配列・Trie木を理解していれば難しいところはなく、時間をかければ自力で解けたはず、とは思う。
ただ、解けたとしてもEやFより時間かかっただろうから仕方ないか。
登録:
コメント (Atom)