暴力
並び替え部、右サイドを維持するために、左端点セットが決意することなく、Nプラス暴力に添加することができ、再びDFS
Nホップに追加し、レースの前半の思想が、考えていなかったが、常にあなたが等しいシェアを接続したいポイントをマージしたかった場合は比較的小さく、その後、分解図であります
問題は、ツリーか剛性の思考の裁判官について考えています
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 5E5 + 5 。 int型のn; int型のmiR [MAXN * 2 ]、VIS [MAXN]。 ベクトル <ペア< int型、int型 >> V。 設定 < 整数 > 秒; ベクター < INT > G [MAXN]。 ボイド DFS(INT U){ 場合(VIS [U]){ リターン。 } VIS [U] = 1 。 ために(オートV:G [U]){ DFS(V)。 } } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; ++ I){ int型の L、R。scanf関数(" %D%D "、&L&R)。 v.push_back(make_pair(L、R))。 miR [R] = I。 } int型 CNT = 0 。 ソート(v.begin()、v.end()); 以下のために(INT iが= 0 ; I <v.sizeを(); ++ I){ もし(CNT == N){ ブレーク。 } ペア < int型、整数 > 0 = V [i]は、 int型 L = o.first、R = o.second。 以下のための(!;それ= s.end();自動それはs.lower_bound(l)を= ++ それ){ 場合(* IT> R){ ブレーク。 } G [たmiR [R]一back(MIR [ * こと])。 G [たmiR [ * それ]一back(MIR [R])。 ++ CNT; もし(CNT == N){ 休憩; } } s.insert(R) } であれば(CNT = N! - 1 ){ プット(" NO " )。 リターン 0 ; } DFS(1 )。 以下のために(INT iが= 1 ; I <= N; ++ I){ 場合(!VIS [I]){ プット(" NO " )。 リターン 0 ; } } プット(" YES "); リターン 0 ; }