P2420 讓我們異或吧(倍增)

2022-04-06 04:14:29 字數 1462 閱讀 4279

異或是一種神奇的運算,大部分人把它總結成不進製加法.

在生活中…xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼:

(a是否是男生 )xor( b是否是男生)=a和b是否能夠成為情侶

好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上有乙個權值。我們要進行m次詢問,對於每次詢問,我們想知道某兩點之間的路徑上所有邊權的異或值。

輸入格式:

輸入檔案第一行包含乙個整數n,表示這顆開心的樹擁有的結點數,以下有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

32 4

5 41 1

輸出樣例#1:

975

14675

0

對於40%的資料,有1 ≤ n,m ≤ 3000;

對於100%的資料,有1 ≤ n ,m≤ 100000。

/*

倍增 如果注意兩點這題就比較水

1.統計兩點異或值的時候用兩點到根節點的異或值相異或就可消去lca到根節點的異或值

*/#include

#define ll long long

#define maxn 300100

using

namespace

std;

intn;

ll m[

100100

];

intto1[maxn],dis_now1[maxn],first1[maxn],s1,next1[maxn];

intto[maxn],dis_now[maxn],first[maxn],s,next[maxn];

void add1(int x,int y,int

c)

void build(int x,int y,int

c)

void dfs(int fa,int p)//

build(p,y,dis_now1[i]);

dfs(p,y);

} } void find(int x,ll dis)//

統計到根節點的異或值

} intmain()

dfs(

0,1);

find(

1,0);

intnum;

scanf("%d

",&num);

for(int i=1;i<=num;i++)

}

P2420 讓我們異或吧

p2420 讓我們異或吧異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點...

P2420 讓我們異或吧

異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上有乙個權值...

P2420 讓我們異或吧

對於異或,就是將之前的求和的 號改為 即可 其他完全一樣 1 include2 using namespace std 3 typedef long long ll 4 const int maxn 200000 10 5 intn,m,r 6 見題意7 intw maxn wt maxn 8 鏈式...