arc076_b
https://atcoder.jp/contests/abc065/tasks/arc076_b
考えたこと
最小全域木を求める問題だが、素朴にやると辺が10^10だからダメ
一番xの小さい頂点に注目する
端から埋める
この頂点は自分以外のどれかとつながらなければならない
xが次に小さい点に繋ぐか、yの近い点に繋ぐか
yの最も近い点が高速に見つけられると良い
うーん、セグメント木を二分探索かな
でも「xが一定以上で」という条件付きで見つけたいのだよな
yでソートして双方向リストに入れておき、xが小さい方から試した後でそのxを取り除いておけば良い
双方向リストは削除がO(1)だし、前後の値を見るのもO(1)
削除しかしないリスト前にも考えたよな、と思ったらゼロフィルのリンクトリストだった。
この時と違ってi番目の要素にO(1)でアクセスしたい
リンクトリストはi番目アクセスが遅いと思いがちだが、それは追加削除した後でのi番目にアクセスする場合であって、削除しかしない場合に追加時のiでアクセスするのはO(1)
これで、前処理O(NlogN)、本処理O(N)になる
公式解説
隣だけを見れば良い
これは僕の解法で「xでソートして次」だけ見てるのや「yでソートして前後」だけ見てるところでも使っている
各点はx順での前後とy順での前後以外に繋がらない
→辺の本数をNのオーダーまで減らせる
→最小全域木
考察
最小全域木の問題で辺がN^2オーダーで間に合わない時には辺を削減できないか考えるべきか
辺の削減→最小全域木