C 難しかった。最大値を使うかどうかで場合分けした。使うときは残り二個全探索。使わないときは、大きい二個(b,c)全探索で、残り一個aがa>MAX-b-cかつa>c-bなら良い。この個数は二分探索で求められる。
— titia (@titia_til) June 23, 2025
D degreeが2の頂点があるのが必要十分。そこだけ一直線にして、あとは交互に向き付け。
2025年6月25日水曜日
Educational Codeforces Round 180 (Rated for Div. 2)
Dまで。
Bは難しい方法で解いてしまったが、単調増加や単調減少だとダメだけど、そうでなければ一回、という簡単な解法があった。単調増加or単調減少じゃないなら、山や谷の箇所があるので、確かに、という感じだが、気付かなかった。
コンテスト後のツイート
根以外で枝分かれのない木の場合はコンテスト中にできていて、その場合は、素因数分解して、x*y*zなら、1+x/2+y/2+z/2みたいに求まる。
それを応用して解こうと思ったが、結構苦労してしまった。
木を、根からではなく、葉から作っていこう、と考えると良い。
・木Aと木Bを根同士を合わせる形で合体させると、node数はその和-1で、mの値はその積のような木になる。
・木に親をつけると、mの値は+2する。
この二つの遷移でDPすればOKでした。
2025年6月23日月曜日
第六回日本最強プログラマー学生選手権-予選-(AtCoder Regular Contest 201)
ABの二完で青に落ちる。Dの解法は分かっていたのに実装できず。最近、実装力が落ちているのかも。まずいなぁ。
コンテスト後のツイート
D A.sort() B.sort() A.reverse()とすると、A[i+ind]とB[i]を組み合わせればOK。その後、indを二分探索する……とか嘘に嵌って通せず終了。
— titia (@titia_til) June 22, 2025
C - Prefix Covering
Trie木、木DPというキーワードを見てAC。
コンテスト中は、Trieを使うのだろうとは思ったが、数え上げ方が分からなかったため飛ばした。
しかし、木DPだと言われたらすぐ解答が思いつけたのだから、もう少し粘るべきだったかもしれない。とはいえ、考えていたときに木DPは浮かんでいなかったので、本当に解けたかは分からない。
D - Match, Mod, Minimize
WAの原因は、累積和用のLISTを円環用に2*Nの長さにしていたのに、累積和を取るときNまでしかしていなかったせいだった。
ちゃんと累積和取ったらWAはなくなってTLEになり(二分探索中に二分探索してるので仕方ない)、RUSTに直したらAC。
その後、尺取りに直してPyPyでもAC。
しかし、bisect→尺取りに直すのでも3WAしておりまずい。
実装力というか注意力みたいなのが落ちているのかも。それってどう対策したら良いんだろう?
2025年6月22日日曜日
ユニークビジョンプログラミングコンテスト2025 夏(AtCoder Beginner Contest 411)
Eまで五完。
コンテスト後のツイート
最初TLEしたときdefaultdictのせいかと嫌な気持ちになったが、ただのmodの取り忘れでほっとした。
— titia (@titia_til) June 21, 2025
F マージテクだよね→WA。WAの原因が分からぬまま終了。愚直を書くべきだったかも。
F - Contraction
自力AC。
コンテスト後の冷静な状態ならすぐ分かるだろうと愚直書かずにやろうとしたらペナ量産。一時間くらいして諦めて愚直&ランダムテストを書いたらようやく分かってAC。消すべき辺を消していないところがあったためのWA(やRE)でした。
愚直を書いた方が速く解ける場面が多いのはそうだけど、これくらいの問題で愚直を書くのも……という気持ちも間違ってないと思うので、どうしたら良いのかね。
G - Count Cycles
一応自力ACだが、bit DPでいける……みたいなツイートは目にしていた。
素直にbit DPを書くとN^3 * 2^Nくらいの計算量になるが、定数倍高速化をしていればなぜか通る。ただし、自分の場合はPyPyでは通らず、RUSTに直さなくてはいけなかった。
が、これは、start位置を固定してそれぞれでbit DPを行っていると考えられるためで、そう考えると実は(ならし)計算量が減っている(解説を見て理解)。
その方針ならPyPyでもACできた。
2025年6月21日土曜日
yukicoder contest 471
A一完。
クエリの30回ってbitの長さくらいだね、とは思ったはずなのに、思いつけなかったのはダメ。
No.3185 Three Abs
自力AC。
いわゆる耳DPですね。これはすんなり解けました。
No.3187 Mingle
hamamuさんの解法ツイートを見てAC。
もらうDPで二乗になるのを配るDPにすると区間加算になるとは気付けなかった。
さらに、どのような区間になるのか? という部分でも結構困った。実験したり、式を書いたりしてなんとか理解し、AC。
実装には双対セグ木を使いました。
2025年6月20日金曜日
Codeforces Round 1032 (Div. 3)
Fまで六完。Div. 3で二問解けないのはまずい。
コンテスト後のツイート
D 1から順に運ぶ。
— titia (@titia_til) June 17, 2025
E x桁より上の桁が、1差か0差か、それ以外か
F xより大きいものを含まない区間に分ける。それぞれについて、累積和を取り各値を取るindexをdict(list)でもつ。[l:r]について考えるなら、lは、累積和がS[r]-sで、rの前のxを取るようなindex以前のもの。この個数は二分探索で求まる。
G. Gangsta
解説AC。典型かもしれないけど難しく感じた。
まず、0と1の個数のうち多い方、というのを
・((0の個数)+(1の個数)+(0の個数と1の個数の差))/2
と言い換える。
そうすると、あとは、全ての区間について、(0の個数と1の個数の差)の総和を求めれば良い。
このために、"1"を+1、"0"を-1とした累積和を考える。この、任意の二項の差の絶対値を求めれば良い。
ここでBITを使って、BITに個数や総和を載せて解く方法もあるようだ(よく分かっていない)。
が、公式解説はもっと簡単。
累積和の配列をAとし、Aをソートする。
二項の差の絶対値を考えるということは、自分より大きい項からは引かれ、小さい項については足されるということ。
なので、
・A[i]*(i-(len(A)-1-i))
の和を求めれば良い。
前半も後半も見たことあるような内容ではあるが、とはいえこの二つを繋げるのは結構難しい気がする。
2025年6月18日水曜日
CodeQUEEN 2025 予選 (AtCoder Beginner Contest 410)
Fまで。
Fはうまくやればdictは必要なかった。どの数字が何個あるかを配列に記録し、差分計算すれば良かった。PyPyで通せなかったのには理由がありました。
ただ、思いつくべき内容ではあったが、個人的にはこういうlog外しはあまり重要に思えないのよね。AHCで焼きなましの回数を増やしたい! とかなるとこういうことも重要になってくるけども。しかしそれも、高速な言語に書き換えた上での話な気もする。
コンテスト後のツイート
F 一行ごとならZero-Sum Rangesみたいに解けるので、H*H*Wの計算量になる。H,Wの大小で場合分けすれば解けると思ったがPyPyだとTLE一個が取れない。仕方なく、AtCoder生成AI対策ルールを久々に見に行き、RUSTに変換してもらったら2784 msでACした。
— titia (@titia_til) June 14, 2025
G - Longest Chord Chain
解説放送を見てAC。解説を見てしまったけど、多分時間があれば自力で解けたと思う。
[a,b]と[c,d]の区間が交わらないような最長のものを求める感じなのは分かるが、円環の問題なので、どこかで切り分けなくてはいけないのが難しい。
これを、[a,b]だけでなく、[b,a+2*N]も考えることで、ただのLIS(今回は、最長減少部分列の方だが)を求める問題になるというのは驚き。こうすると実装しやすいね。
2025年6月16日月曜日
AtCoder Regular Contest 200 (Div. 2)
ABの二完。若干レートは下がったが、それほど失敗したという感覚はないため厳しい。Aは、最初から紙で立式すべきだったかなぁ。
コンテスト後のツイート
AtCoder Regular Contest 200 (Div. 2) AB二完。
— titia (@titia_til) June 15, 2025
A Ai/Biが異なるものがあればその二つで作れる。Ai/BiとAj/Bjの間にある分数はStern–Brocot木を思い出せば作れる。
B 100と11100みたいなので大体作れた。
C Li<Lj<Rj<Liのときjからiに辺を引く。その中で辞書順最小かと思ったが、8caseしかACしない。
C - Movie Theater
後ろから決めていけばいい、というツイートを見てAC。
どこでWAになっているかの判断を誤っていたのがダメだった。今回は、人の順番の配列を求めた後、その逆写像が答えになるわけだけど、「人の順番の配列」の辞書順最小を求めても、その逆写像が辞書順最小にはならない。
ここに気付かず、もっと別の条件の部分で間違っていると思ってしまってダメだった。
逆写像を辞書順最小にするためには、後ろから決めていけばよい。
このことは知らなかったけれど、この部分が間違っていると気付けたら試したと思う。
D - |A + A|
自力AC。
コンテスト中に書いた実験コードを利用してAC。
コンテスト中は実験しても偶数のときの構築が分からなかったのだけど、落ち着いて実験結果を見たら、6以上なら、0, 1, 2, 4のように、0から連続する数+一つ飛ばしでできていた。
2は、偶数のときは0とM/2で良い。(奇数だとダメ)
4のときでWAを出してしまったが、2のときと同じように、Mが4の倍数なら0, M/4, M/2で作れる。
コンテスト中は、Dを20分くらい考えた後、分からなそうと思ってCに行ったのだが、その判断はどうだったんだろう。
一応、今考えてACするまで30分はかかっていない気がするが、コンテスト後に落ち着いて
実験結果を眺められたからという気もするし、WAの修正に12分もかかっている。
Dに集中していたら解けた可能性がなかったとは思わないけど、望み薄だったかなぁ。
2025年6月14日土曜日
yukicoder contest 470
Cまで三完。
No.3180 angles sum
tangentの加法定理を使って書いたら1case(コンテスト後追加されたHackのcase)以外AC。y座標が0の場合が問題なため、場合分けしてAC。
コンテスト中は、ベクトルの内積でcosを求め、加法定理を使って式変形をしていたが、答えが合わなかった。誤差のせいなのか式変形がまずいの分からず困っていたら終了。
tangentの加法定理でも解けるだろう、ということはコンテスト中から気付いていて、そっちで式を書いてみるとその方が簡単だった。
ただ、どっちの方法でも解けるはずなので、早く方針転換すべきだった、というのも違うような。
No.3181 find H
三角形の五心について、何かと何かの距離が1:2になるというのは覚えていたが、どれとどれかが覚えておらず検索した。
知識問題ですね。
No.3182 recurrence relation’s intersection sum
解説AC。
解説を読むと行列累乗の典型問題なので、自力で解けなかったのが悔やまれる。
行列累乗に持ち込むため、A_nやS_nだけではなく、1やn, n^2といったもの(関数)を行列の要素に入れるという手法は見たことあったはずなのに思い出せなかった。
2025年6月10日火曜日
yukicoder contest 469
No.3172 三角関数べき乗のフーリエ級数展開
何も分からなかったので、サンプルからOEISを経由してAC。
まあ、二項係数じゃないか? とは思ったので、OEISを見なくてもACできたかもしれないけど。
自力で解答にたどりつけたかもしれないけど、式変形して正解を得られる気がしない。
No.3173 じゃんけんの勝ちの回数
ツイッターで、フローで解けるというのを見てしまったため、それでAC。(minだけフローを使った)
解説を見たら、フローを使わなくても解けるのね。
yukicoder contest 468 Desire for Approval ~Ash blown by the draft leads to the door to a new beginning~
AHCを頑張ろうと思っていたのでAだけAC。
No.3166 [Cherry 7th Tune *] 桜の守人
解説AC。
二分探索は分かったが、その後分からなくなり解説を見た。
分からなくなってしまったのは、全ての整数座標、もしくは整数/2の座標の頂点が守られているか? と考えてしまったせいだった。座標圧縮が必要なはずだけど……などと考えて混乱。
守る範囲は区間なのだから、[x-p,x+p]に全ての区間が含まれているか? と考えるのは自然。これは、イベントソートを使って解くことができる。
No.3167 [Cherry 7th Tune C] Cut in Queue
自力AC。そこそこ苦労したが解けて良かった。
クエリ先読みを使い、クエリ2の削除しないものとして、最終的なAの配列を求める。
クエリ1で、何の直前に何が付け加わるか? というのが与えられている。これをなぞるのは、木構造でDFSして求めていく感じになる。
あとは、Bit_indexed_tree上の二分探索を駆使したら解けた。
No.3168 [Cherry 7th Tune D] Manhole
自力AC。
図を描いて相似を見つけたら解けた。空間図形には苦手意識があるため、図を描いた後しばらく分からなくて焦った。
登録:
投稿 (Atom)