2022年10月19日水曜日

Codeforces Round #828 (Div. 3)

 E2が解けずに終了。

コンテスト後のツイート

E2. Divisible Numbers (hard version)

 解法ツイートを参考にAC。

 制約を考えると、約数・倍数の関係で絞るしかない。a*bの約数を使うはず、というところから進まなかった。

 正しい方針は、a*bの約数xをa~cで利用したいなら、a+1以上でxの倍数のうち最小のものを使うべき。これは求められる。同様に、yは、b+1以上でa*b/xの倍数のうち最小のものを試す。

 a~cの範囲でxを決めたとき最適なyを求めるためにはどうするか? という考え方はE1でも使っていたのだから、約数の関係を利用して同じようにすれば良かった。多少焦っていたにせよ、これくらいは気付きたかった。

2022年10月16日日曜日

Codeforces Global Round 23

 Cまで三完と悲惨な出来。


D. Paths on the Tree

 解法ツイートを見てAC。本番中1500人近くも通していたから簡単なのかと思ったら、解法も実装も難しくてびっくりした。

・各頂点の重複度の最大値と最小値が高々1しか離れない

 と気付くのがポイント。

 これは直観的にそうだよね、と思いたい。

 頂点xの重複度がyで、子の数がcのとき、xの子たちの重複度は、y/cの切り捨てか切り上げになる。これを繰り返しても、(頂点1の重複度である)kを、pathをたどったとき現れる子の数c_1, c_2, ...の積で割ったものの切り捨てまたは切り上げになる。割り算の式から不等号を導けば、証明できたが、そんなことをしなくてもまあ直感的に(あるいは知識として)正しいと分かっておきたいもの。

 これを利用して木DPすれば解けるのだが、実装もなかなか大変だった。
 

E1. Joking (Easy Version)

 解法ツイートを見てAC。

 0, 1, 2の3要素が残ったとして、

・{1,2}を聞く
 →”NO"なら{1}を聞く
   →"YES"なら{1,3}に、"NO"なら{2,3}に絞れる

 →"YES"なら再度{1,2}を聞く
   →"YES"なら{1,2}に絞れる。"NO"なら最初に"NO"が来たときと同じ手順を踏む

 とすれば三回で2/3くらいになってACできる。

 試行錯誤するしかないけれど、Aと¬Aを質問するのは意味が変わらない、ということには早く気付くべきだった。そうすれば、三等分するという方針には早くたどり着けたと思う。(が、三等分してからも難しい。コンテスト中も三等分することは一応考えたけど、その後が思いつけていないので……)

2022年10月15日土曜日

yukicoder contest 364 (Do you know Cherry Contest?)

 Eが解けずにマラソンへ行き、マラソンが10位。 通常(アルゴ)のコンテストにマラソン問題が混じっているのは好き。

コンテスト後のツイート

No.2101 [Cherry Alpha N] ずっとこの数列だったらいいのに

 解説AC。

 イベントソート(平面走査)だとは思ったが、何を管理すれば良いかが分からなくなってしまった。

・元の数列の値(減り終わったら0に更新する)
・減り始める時間
・減る途中のものの個数

 を持って、減り始めるときと、減り終わるときにupdateするようにすれば、答えを求めることができる。

 イベントソートという方針自体はすぐ思いついたので、時間があれば解けたとは思うが、何を管理すれば良いか考えるのはいまだに苦手。とはいえ、解けなくてはいけない問題でした。

 なお、PyPyだと(意外と)制限時間が厳しく、セグ木の関数で内包表記を使っているとTLEが取れなかった。PyPyだと内包表記が遅いのには注意。

2022年10月14日金曜日

ユニークビジョンプログラミングコンテスト2022 夏(AtCoder Beginner Contest 268)

  ABCEFの五完。

コンテスト後のツイート



 G - Random Student ID

 解説放送を見てAC。

 あんまり自分で考察しなかったけど、考察ができてもTrie木を使うことを思い付けたかどうか。Trie木を使わなくても上手くソートすれば解けそうだけど、実装で苦戦してしまいそう。

Ex - Taboo

 解説放送を見てAC。

 Aho-Corasick法を勉強しました。
 もっと難しいかと思っていたけれど、結構理解しやすいアルゴリズムでした。
 


Codeforces Round #827 (Div. 4)

 Rustで出て全完。時間はかかったが、Rustで全完できたのは良かった。
 →システムテストも全部通ってた。結構Hackが出てたので心配していたけど、通って安心。

コンテスト後のツイート




2022年10月13日木曜日

AtCoder Regular Contest 149

 Cまで三完。

コンテスト後のツイート


D - Simultaneous Sugoroku

 解説AC。
 いわゆるマージテクではなかった。

・Xの範囲が小さいので、区間[1,10^6]の全ての答えを求めても良い
・区間を最小値・最大値で管理する

 の二つがポイント。

 ただ、一つ目を思い付けば二つ目は自然か。
 Xの最大値が大きくないことに注目して、データを扱いやすい形で持ちたい、と考えれば一つ目の考え方も自然。

 そもそも数学では、「一般化した方が扱いやすくなる」問題は多いのだから、一般化できないか? と考えてみるべきでした。

 なお、テストケースが弱い模様。
 木の根から答えを反映させるって処理をサボって、各座標ごとに子孫がどこへたどりつくか調べるのを投げてみたら通ってしまいました。

2022年10月12日水曜日

yukicoder contest 341

 ABの二完。


No.1917 LCMST

 解説AC。

 一見手がかりのない問題だけど、最小全域木を作る方法は普通はクラスカル法かプリム法なわけなので、

・最小全域木を作る方法としてクラスカル法を用いよう、そのために、辺の候補を絞り込もう

 と考えるのが重要。

 そして、最小公倍数が問題になっているのだから、約数・倍数の関係を用いて絞り込むのだろうな、と考えれば(証明はともかく)解説の方法を思い付くことは可能そう。

 難しいけど、多分こうだろうな、という考察を推し進めていけば思いつけない問題ではなかった。