【】プログラムは自動的NOI2015を解析します

フェイス質問

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 " ); 
  } 
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11427240.html