BFSの解体、複雑さのn ^ 2 * log(n)のに暴力を継続して使用することを検討、1E5複雑さがああ行う方法がわかりません。。
#include <ビット/ STDC ++。H> の#defineは LL長い長 の#define LD長い二 の#define ULL符号なし長い長 の#define第Fiの に#define SE第二 の#define MK make_pair の#define PLL対<LL、LL> の#define PLI対<LL、整数> の#define PII対<整数、整数> の#define SZ(X)((INT)x.size()) の#define ALL(X)(X).begin()、(X).END( ) の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して名前空間はstdを、CONSTのINT N = 1E5 + 7 。 const int型 INF = 0x3f3f3f3f 。 constの LL INF = 0x3f3f3f3f3f3f3f3f 。 const int型のmod = 998244353 ; constの ダブル EPS = 1E- 8 ; CONST ダブル PI = ACOS( - 1 )。 テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(A> = MOD)A - = MOD;} テンプレート < クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(<0)、A + = MOD;} テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、真:偽;} テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?= bの、真:偽;} int型のn; 構造体ノード{ int型、B、C、D。 ボイドリード(){ scanf関数(" %D%D%D%D "、&、&C、&B、&D)。 } ボイドプリント(){ のprintf(" %D%D%D%D ^^ \ n " 、A、B、C、D)。 } }。 キュー <ベクトル<ノード>> QUE。 ベクトル <ノード> 今、TMPL、tmpR。 ブール CMPA(CONSTノード&X、CONSTノード&Y){ 戻り XA < 屋。 } BOOL CMPB(CONSTノード&X、CONSTノード&Y){ 戻り XC < YC。 } BOOL {)(解きます ソート(ALL(今)、 INT MAXB =今[ 0 ] .B。 以下のために(int型 i = 1 ; iは<SZを(今); iは++ ){ もし(現在[I] .A> = MAXB){ tmpL.clear()。tmpR.clear(); 用(INT J = 0 ; J <I、J ++ )tmpL.push_back(今[J])。 以下のための(int型 ; J <SZ(今)J ++ J = tmpR.push_back(今[J])); que.push(TMPL)。que.push(tmpR)。 返す 真; } 他chkmax(今MAXB、[I] .B)。 } ソート(ALL(今)、CMPB)。 INT MAXD =今[ 0] .D。 以下のために(int型 i = 1 ; iは<SZを(今); iは++ ){ もし(現在[I] .C> = MAXD){ tmpL.clear()。tmpR.clear(); 用(INT J = 0 ; J <I、J ++ )tmpL.push_back(今[J])。 以下のための(int型 ; J <SZ(今)J ++ J = tmpR.push_back(今[J])); que.push(TMPL)。que.push(tmpR)。 返す 真; } 他chkmax(MAXD、今[I] .D)。 } {main()の返す 偽; } int型 scanf関数(" %のD "、&N) ベクター <ノード> (N) 以下のために(int型 i = 0 ; iがn <I ++は[i]が.read())を、 que.push(A)。 しばらく(!que.empty()){ 今 = que.front(); que.pop(); もし(SZ(今)== 1)続けます。 もし(!解く()){ プット(" NO " ); リターン } }0 ; プット(" YES " ); リターン 0 ; } / * * /