フェイス質問
https://www.luogu.org/problem/P1955
問題の解決策
書式#include <cstdioを> する#include <iostreamの> の#include <アルゴリズム> に#define里レジスタINT 使用して 名前空間はstdを、 INT [F 200050 ]。 INT [ 100050 ]、B [ 100050 ]、C [ 100050 ]。 構造体ノード{ int型のx、ID、S。 ブール 演算子 <(constのノード&RHS)のconst { 戻り X < rhs.x。 } } LL [ 200050 ]。 INT FindRootで(INT X){ もし(F [X] == x)をリターンX。 戻り F [X] = FindRootで(F [X])。 } int型N、T。 INT メイン(){ scanf関数(" %のD "、&T)。 一方、(T-- ){ scanf関数(" %のD "、&N) 用(RI I = 1 iが++; iが<= N ){ scanf関数(" %D%D%D "、および[I]、&B [i]は、&C [I])。 LL [ 2 * I- 1 ] =(ノード){[i]は、I、0 }。 LL [ 2* I] =(ノード){B [i]は、I、1 }。 } ソート(LL + 1、LL + 2 * N + 1 )。 int型 CNT = 0 ; 用(RI i = 1 ; iは= < 2 * N; iは++ ){ 場合([I-LL [I] .X = 11!1 CNT] .X)++ ; もし(LL [I] .S == 0)[LL [I] .ID] = CNT。他の B [LL [I] .ID] = CNT; } のための(RI i = 1 ; iは= CNTを<; iは++)F [I] = I。 用(RI i = 1 ; iが<= N iが++)場合(C [I] == 1 ){ int型、R1 = FindRootで([i])と、R2 = FindRootで(B [I])。 もし(R1 == R2)続けます。 F [R1] = R2。 } INT ANS = 1 。 用(RI i = 1 ; iが++; iが<= n)の場合(C [I] == 0 ){ int型、R1 = FindRootで([i])と、R2 = FindRootで(B [I])。 もし ANS = {(R1 == R2)0。破る;} } 場合(ANS)プット(" YES "); 他プット(" NO " ); } }