01Trie樹 p2420 讓我們異或吧

2022-05-27 17:33:13 字數 1303 閱讀 7887

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

在生活中…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行,每行乙個整數,表示異或值

很明顯,樹上問題求解兩節點間的問題,直接考慮到\(lca\)

我們記錄\(dis[u]\)代表從\(u\)到根節點的路徑異或值

那麼我們可以在\(dfs\)預處理倍增陣列的時候預處理出來我們的\(dis\)陣列.

\(dis\)陣列有什麼用?

如圖,我們詢問節點\(x->y\)的路徑異或值。

此時已知\(dis[x]\)與\(dis[y]\),根據\(xor\)的性質。

可得\(x->y\)的路徑異或值為\((dis[x]\ xor \ dis[lca_])\ xor \ (dis[y]\ xor \ dis[lca_])\)

直接求解即可

#include#include#include#define n 100008

#define r register

using namespace std;

inline void in(int &x)

while(isdigit(s))

x*=f;

}int depth[n],n,m,dis[n],f[n][21],head[n],tot;

struct codedge[n<<2];

inline void add(int x,int y,int z)

void dfs(int u,int fa,int w)

return f[x][0];

}int main()

{ in(n);

for(r int i=1,x,y,z;i不太理解為什麼要建雙向邊,

如果有大佬懂的話能否告知蒟蒻我 qwq

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 鏈式...