2021年7月31日土曜日

Educational Codeforces Round 112 (Rated for Div. 2)

  pretestはDまで四完でした。


E. Boring Segments

 解法ツイートを見てAC。

・コストの絶対値を小さくしたい→コストでソートして最小コストを決め打ったときに最大コストがいくらあれば良いかを調べたい→尺取り
・その際、どこからどこまで行けるか? を遅延セグメント木を用いて管理すれば、ゴールまでたどりつけるかを判定できる。

 解法を見ればシンプルなのだけど、コストでソートする発想が浮かばなかった。
 最初、道の左端でソートして上手くいく気がしてしまい、それでダメだと分かった後も発想を転換できなかった。
 コストの最小値を決めて最大値を二分探索して判定問題、とは考えたのだから、尺取りも思い浮かんで良かったはずなのに……。(今回は尺取りだとできるけど、二分探索では上手くできなそうですね)

 ただ、コストのMAX-MINを最小化したいのだから、コストでソートして尺取り、というのは結構自然。それさえ思いつけば、遅延セグ木を使うやり方にたどりつくのは困難ではなさそう。

2021年7月30日金曜日

Codeforces Round #735 (Div. 2)

 Cが分からなかった。


C. Mikasa

 koboshiさんの解説が分かりやすかった。

・とりあえず立式をすると、x xor n >m を満たす最小のxを求めれば良いと分かる。
・上の桁から確定させていく。

 の2ステップ。
 コンテスト中、どちらも考えたはずなのに、解法にたどりつけなかった。

 多分、立式した式を明示的に書かなかったのが良くなかった。
 ちゃんと紙に書き、どういう風に求めれば良いか、具体例(たとえばサンプルの最後のもの)を桁ごとに書けば分かったんじゃないだろうか。
 手間を惜しんではダメ。

2021年7月29日木曜日

AtCoder Beginner Contest 210

  ABCEの四完。Dは結構思いつきにくい気がする。Fは難し過ぎませんか?


D - National Railway

 解説AC。
 難しい! DPは全く思い浮かばなかった。マンハッタン距離だから、45度回転ばかり考えてたのが敗因か。

F - Coprime Solitaire

 色々解説を読んだけど、主にkyopro_friendsさんの公式解説でAC。

 2-SATに帰着する問題。
 2-SATに帰着できるということは、コンテスト中は思いつかなかったけれど、言われれば確かに、という感じ。少し慣れている人なら思いつけそう。

 だけど、その後の処理は難しすぎませんか?
 累積和を使えば二乗から線形に計算量を落とせる、と。これは思いつける気がしない。
 結構すんなり解けている人もいるようなのだけど、典型テクニックなのだろうか……。

 さらに、データの持ち方が悪いとTLEしたり、再帰を使ったSCCだとTLE+MLEしたりと大変でした。(ので、SCCは借りてACしました)
 非再帰のSCCは実装しないとまずいですね。

2021年7月27日火曜日

AtCoder Regular Contest 124

 Cまで三完。


D - Yet Another Sorting Problem

 解説は見たものの、さっとは理解できなかったため、参考にして実験してAC。

 グラフの問題だと思ったし、連結成分に注目するのかな? とは疑ったものの、確信が持てず捨ててしまった。
 連結成分ごとにサイクルになる、ということに気付いてなかったのは問題。気付けば当たり前だけど、ここが考察の第一歩だったと思う。

 その後の考察はどうすれば良かったか難しい……。

 確かに、「左側/右側だけのサイクル」は「左右両方の側に要素があるサイクル」よりコストがかかるのは分かる。
 具体的には、後者は、連結成分のノード数-1回操作すれば良いが、前者はノード数+1回操作しなくてはいけない。

 ただ、サイクルごとに完結するのではないのが難しい。
 「左側だけのサイクル」と「右側だけのサイクル」が両方あった場合、前者の操作途中で後者の処理をすることにより、後者をノード数-1で済ませられる……というのが本質だった。
 逆に、「左側だけのサイクル」が複数あっても、それぞれの操作が干渉しないため、操作回数を減らすことはできない。
 なので、max(「左側だけのサイクル」の個数, 「右側だけのサイクル」の個数)だけ、操作回数が増えるものがある、ということになる。

 コンテスト中は、「左側だけの連結成分」と「右側だけの連結成分」(コンテスト中は連結成分がサイクルになると気付いてなかったのでこう書いています)が干渉することがある、ということは、連結成分ごとに見る方針は間違っているのでは? と思ってしまい、考察を進めることができなかった。

 解法を見ても、試行錯誤するしかないかなぁ、という気もするので何を反省すべきか難しい。
 思いつけてない何かがあったというわけではなく、どれが正しい方針か分からなかったという感じだし。

 愚直solverを書いていたら多少違ったかもしれないけれど、決定打にはならなそうだし、どう実装すれば良いかもちょっと迷ってしまう。さっと書けるなら書いていたと思うので。

 うーん。
 書くなら、順列同士で、一回の操作で行けるもの同士にedgeをつけて、ソートされたものからBFSする感じか。これでN+Mが9あたりまでは判定できるなら、実装する価値はあったかも。

(EやFはACしたら追記)

2021年7月26日月曜日

AtCoder Beginner Contest 211

 Eまで五完でした。


E - Red Polyomino

 この問題を思い出したので、この解法で解いた。
 ただ、DPしているけど、別に計算量は良くないね。
 解いているとき、Kの制約をあまり見ていなかったのだけど、たとえばN=8, K=32ならTLEするので、この解法で解く意味はあまりなかったよう。
 ただ、コンテスト中、全探索もちょっと考えたものの実装がよく分からず避けた、という面もあるので、うーん。

F - Rectilinear Polygons

 コンテスト中に考えていた方法で自力でACできました。

 つい二次元累積和(imos法)を考えたくなるけれど、この問題では座標圧縮もきかないため間に合わない。 
 そこで、平面走査を思い付くのが重要。
 x座標が小さい順に見よう、と思えば後はポリゴンの処理が悩むところ。

 そこは、縦の線分を順番に見て行ったとき、前の線分と重なる方向か、同じ方向か、で場合分けすると上手くいきます。

 Eまでに時間がかかったのと、平面走査を思い付くまで時間がかかったため解き終わらなかったけど、これは解けなくてはいけない問題でした。


 今度からABC八問体制になるそうで、そうすると全完はかなり厳しくなりそう。今回はチャンスだったと思うので、もったいなかった。

2021年7月25日日曜日

TopCoder Single Round Match 810

  EasyはHackされたけどMedが通って助かった。


Div1 Easy WatchedSnail


 二人ずつペアにして考えることが重要だった。
 三人以上重なってもワープできると思い込んでいたのでHackされたのも当然。図を描いたとき、一瞬、二人までしかダメじゃない? とは思ったんだけど、なぜか大丈夫な気がしてしまった。

Div1 Med IcelandRingRoad


 AtCoderのこの問題の部分問題になっている。

 この問題はACしたことなかったけど、問題を読んだことあったため、この公式解説を読む、というムーブが取れ、救われた。

 ハッシュを使った乱択解なのでやや怪しく見えるのか、tourist氏にチャレンジされたり、neal_wu氏に褒められたりした。SRMでチャットしたの多分初めて! ちょっと興奮した。

 これを機に、AtCoderの方の問題もACしました。

2021年7月24日土曜日

yukicoder contest 304

 Bが分からなかった。


No.1623 三角形の制作

 解説AC。

 まず、$n \le 2 \times 10^5$なのに、$r_i, g_i, b_i \le 3 \times 10^3$というのがどういう意味なのか気付く必要がある。
 言ってしまえば、実質$n \le 3 \times 10^3$なんですよね。そこに気付くのが重要。コンテスト中この制約は見ていたはずなのだけど、頭が回っていなかったのか理解できていなかった。

 (緑色、青色)のペアを全列挙できるということに気付いたら、累積和を使うという発想はまあ自然ですね。