洛谷傳送門
題目描述
異或是一種神奇的運算,大部分人把它總結成不進製加法.
在生活中…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
3 2 4
5 4
1 1輸出樣例#1:
975
14675
0 說明
對於40%的資料,有1 ≤ n,m ≤ 3000;
對於100%的資料,有1 ≤ n ,m≤ 100000。
解題分析
異或的妙妙性質使得異或兩次的部分會抵消為0, 所以我們隨便找乙個點作為樹根, dfs一次算出每個點到根節點的異或和, 然後o(
1)o (1
)查詢就好了。
**如下:
#include
#include
#include
#include
#include
#include
#define r register
#define in inline
#define gc getchar()
#define w while
#define mx 100005
template
in void in (t &x)
}int head[mx], ans[mx], cnt, dot, q;
struct edge
edge[mx << 1];
in void addedge(const
int &from, const
int &to, const
int &len)
; head[from] = cnt;
}void dfs(const
int &now, const
int &pre)
}int main(void)
dfs(1, 0);
in(q);
w (q--)
}
Luogu P2420 讓我們異或吧
兩點之間的路徑的話一定經過它們兩個 lca,這一點已經是顯而易見的,那麼再來看看異或的性質。a xor b xor b a a xor a 0 a xor 0 a a xor b b xor a a xor b xor c a xor b xor c 再回到這個題上來,因為 a xor b xor ...
洛谷 2420 讓我們異或吧
題目描述 異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上...
P2420 讓我們異或吧
p2420 讓我們異或吧異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點...