問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
(電脳言語のオルダーソンループで出題された問題です。8 言語での解答コードと解説が用意されています。)
この問題は前問 (ダンジョンのデッドロック 5) と同じ内容ですが、制約だけが大きくなっています。
あなたは RPG のダンジョンの設計をしています。
そのダンジョンには N 個の部屋が用意されており、それぞれの部屋は 1, 2, ..., N で表されます。このダンジョンでは 1 部屋に 1 プレイヤーしか滞在できません。
また、プレイヤーは M 人いて、現在 i (1 ≦ i ≦ M) 番目のプレイヤーは部屋 S_i (1 ≦ S_i ≦ N) に滞在しています。
ダンジョンをクリアするには M 人のプレイヤーはそれぞれ、部屋 T_i (1 ≦ T_i ≦ N) に移る必要があります。
しかし、部屋の移動は各プレイヤーが好きなタイミングでおこなうため、部屋を移動しようと思ってもその部屋はまだ別のプレイヤーが滞在しているかもしれません。
その場合はプレイヤーは部屋を移動することができません。移動先にいるプレイヤーが先に移動するのを待つ必要があります。
なお、同じタイミングで同時に移動をおこなうことはできません。
ここで、問題が生じました。もしかすると、ダンジョンの移動をどのような順番でしても、移動先の部屋にプレイヤーが居て移動することができないプレイヤーが現れる可能性があります。
例えば下の図では、 3 番目の部屋に滞在していたプレイヤーは移動ができていますが、 1 番目の部屋に滞在していたプレイヤーと 2 番目に滞在していたプレイヤーはお互いに部屋を移動することができません。
このように、どのような順番で部屋を移動しても、部屋を移動することができないプレイヤーがいる状態のことをデッドロックと呼ぶことにします。
あなたの仕事はデッドロックが起きるか起きないかを判定することです。
ただし、滞在している部屋と移動先の部屋が同じ場合、つまり S_i = T_i (1 ≦ i ≦ M) の場合、そのプレイヤーは移動ができることとします。
N M
S_1 T_1
S_2 T_2
...
S_M T_M
・デッドロックが発生する場合は "Yes" を、発生しない場合は "No" を出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件を満たします。
・1 ≦ N ≦ 100,000
・1 ≦ M ≦ N
・1 ≦ S_i ≦ N (1 ≦ i ≦ M)
・1 ≦ T_i ≦ N (1 ≦ i ≦ M)
・S_i ≠ S_j (1 ≦ i, j ≦ M, i ≠ j)
・T_i ≠ T_j (1 ≦ i, j ≦ M, i ≠ j)
4 3
1 2
2 1
3 4
Yes
6 4
5 6
1 2
2 4
3 5
No
3 3
1 1
2 2
3 3
No