[I] - [i]をエッジとして、再び十分オイラー経路を求めて、B。
通信せずに図ことに留意されたいです。。
#include <ビット/ STDC ++ H> の#define Fiの最初 の#define SE第二 の#define MK make_pair の#define PII対<整数、整数> 使用して 名前空間STDを、 CONSTの INT N =(INT)2E5 + 7 。 int型[N]、B [N]、度[N]、N。 int型HS [N]、hs_cnt。 BOOL 禁止[N]。 ベクター <PII> G [N]。 ベクトル < int型 > ANS; ボイド DFS(INT U){ 一方(G [U] .size()){ int型 V =G [U] .back()SE。 int型 ID = 。G [U] .back()Fiの; G [U] .pop_back()。 もし(!禁止[ID]){ 禁止[ID]は = 真。 DFS(V); } } ans.push_back(HS [U])。 } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iがN <; Iは++ ){ scanf関数(" %のD "、および[I])。 HS [ ++ hs_cnt] = [I]。 } 以下のために(int型 i = 1 ; iがn <I ++は{) のscanf(" %dの"、&B [I])。 HS [ ++ hs_cnt] =のB [i]は、 } ソート(HS + 1、HS + 1 + hs_cnt)。 hs_cnt =ユニーク(HS + 1、HS + 1 + hs_cnt) - HS - 1 。 以下のために(int型 i = 1 ; iがn <; iは++ ){ [i]は = LOWER_BOUND(HS + 1、HS + 1 + hs_cnt、[I]) -HS; B [i]は = LOWER_BOUND(HS + 1、HS + 1 + hs_cnt、B [I]) - HS。 DEG [I]] ++ ; DEG [i]は、B [] ++ ; G [I]一back(MK(I、B [I]))。 G [B [I]一back(MK(I、[I]))。 } のために(int型 i = 1 ; iは<N; iは++ ){ 場合([I]> B [I]){ プット(" -1 " )。 リターン 0 ; } } INT =である1、CNT = 0 。 以下のために(int型 I = 1 ; I <= hs_cnt; iは++ ){ 場合(DEG [I]&1 ){ こと = I。 CNT ++ ; } } もし(!CNT = 0!&& CNT = 2)プット(" -1 " )。 他{ DFS(BE)。 もし(!ans.size()= n)のリターン・プット(" -1 ")、0 ; 以下のための(int型 I =(INT)ans.size() - 1 ; I> = 0 ; i-- ){ のprintf(" %d個の%のC "、ANS [i]は、" \ n " [I == 0 ])。 } } 戻り 0 。 } / * * /