XORそれをしてみましょう

タイトル説明

イソプロピルまたは魔法の動作は、ほとんどの人はそれをまとめるほかを運ぶことはありません。

人生の中で... XOR演算も共通しています。例えば、質問に答えるために、それはそうでない場合は0その後、1:

(Aか男性)XOR(Bか男性)= AとBは、カップルになることができます

まあ、今は作ると複雑な状況に対処する必要があります。たとえば、私たちは木を与えるだろう、それはN個のノードを持っていることをうれしいです。ツリーの各側には重量があります。我々は右の2点間の経路上のXOR値のすべての側面を知りたい、毎回が求めて、M回をお願いしたいと思います。

入力形式

入力ファイルの最初の行は整数N、所有ノードの幸せZhekeツリーが含まれ、次の行n-1が存在し、これらの側面を説明し、各行は3つの数字、U、V、Wを有し、U及びVが表しますwは右辺の値を有します。整数Mがある次の行は、問い合わせの数を表します。M行の後に、各列二つの数字U、V、二点間の正しい道の排他的論理和のチャレンジ値を表します。

出力フォーマット

M本の出力線、各排他的論理和値を表す整数

サンプル入力と出力

入力#1
5 
1 4 9644 
2 5 15004 
3 1 14635 
5 3 9684 
3 
2 4 
5 4 
1
出力#1
975 
14675 
0

説明/ヒント

データの40%は、1≤N、M≤3000です。

データの100%に、それは1≤N、M≤100000です。

 

 

形而上学ツリーセクション

 

 

書式#include <アルゴリズム> 
書式#include <cstdioを> 
する#include <ベクトル>
 使用して 名前空間はstdを、
const  int型 MAXN = 100000 + 10 
ベクターは、 <対< INTINT >> [MAXN]エッジ;
INTのN、M、DIS [MAXN]。

インラインint型リード(){
     int型、S = 0、W = 1 チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 ' ){
        もし(CH == ' - ' ){ 
            W = - 1 
        } 
        CH = GETCHAR()。
    } 
    一方、(CH> = ' 0 ' && CH <= ' 9 ' ){ 
        S = sの* 10 + CH- ' 0 ' 
        CH = GETCHAR()。
    } 
    戻り S * W。
} 


インラインボイド DFS(INT今、int型の fは、int型 XOR){
    [今] DISを = Xorの。
    以下のための(iは= SIZE_T 0 ; iはエッジを<今] .size(); iは++ ){
         場合(!エッジ[今] [i]が1次回= F){ 
            DFS(エッジ[今] [i]が1次回、今、Xorの ^ [今]エッジ[I] .second)。
        } 
    } 
} 
INT {main()の
    N = )(読み取ります。
    以下のためにint型 I = 1、U、V、Wは、iがN <; Iは++ ){ 
        U =は、(読み取り)
        V = )(読み取ります。
        W = 読み取り();
        エッジ[U] .push_back(make_pair(V、W))。
        エッジ[V] .push_back(make_pair(U、W))。
    } 
    DFS(111 )。
    M = 読み取ります();
    以下のためにint型 I = 1 ; I <= M I ++は、U、V {)
        U =を読み取ります()。
        V = )(読み取ります。
        printf(" %d個の\ n "、DIS [U] ^ DIS [V])。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/hrj1/p/11230935.html