洛谷P2420 讓我們異或吧(樹鏈剖分)

2022-05-05 20:45:09 字數 2997 閱讀 3578

題目描述

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

在生活中…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。

題解:首先異或和加法一樣zici區間加,並且求的是路徑異或和,所以自然可以想到樹剖維護。好吧,其實我一開始的思路是樹形dp+lca瞎搞搞的,但是因為把邊權看成了點權所以果斷選擇了樹剖。邊權的樹剖怎麼寫,其實和點也沒有什麼區別,就是傳遞的時候多帶乙個邊值罷了。

**如下:

#include#include

#include

#include

#include

#define lson root<<1

#define rson root<<1|1

using

namespace

std;

struct

node

tr[400040

];int w[100010],son[100010],fa[100010],id[100010],deep[100010],size[100010],top[100010],vv[100010],cnt=0

;vector

g[100010],v[100010

];void push_up(int

root)

void build(int root,int l,int

r) tr[root].l=l;

tr[root].r=r;

int mid=(l+r)>>1

; build(lson,l,mid);

build(rson,mid+1

,r);

push_up(root);

}int query(int root,int l,int

r)

if(l==tr[root].l&&r==tr[root].r)

int mid=(tr[root].l+tr[root].r)>>1

;

if(l>mid)

else

}return query(lson,l,mid)^query(rson,mid+1

,r);

}void dfs1(int now,int f,int

dep)

dfs1(g[now][i],now,dep+1

); size[now]+=size[g[now][i]];

if(size[g[now][i]]>maxson)

}}void dfs2(int now,int topf,int

val)

dfs2(son[now],topf,vv[now]);

for(int i=0;i)

dfs2(g[now][i],g[now][i],v[now][i]);

}}void path_sum(int x,int

y) ans^=query(1,id[top[x]]+1

,id[x]);

ans^=w[id[top[x]]];

x=fa[top[x]];

}if(deep[x]>deep[y])

ans^=query(1,id[x]+1

,id[y]);

printf(

"%d\n

",ans);

}int

main()

dfs1(

1,0,1

); dfs2(

1,1,0

); build(

1,1,n);

scanf("%d

",&m);

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

}

洛谷 P2420 讓我們異或吧

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

洛谷 P2420 讓我們異或吧

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

洛谷P2420 讓我們異或吧 DFS

給出一棵樹,每條邊有乙個權值,輸出指定點的路徑異或值。首先,這到題是我在想刷lca lca的時候遇到的,結果這道標籤是lca lca的題目我卻想不到為什們要用lca lca,乙個dfs dfs就可以過。其實要求兩個點的路徑異或值就是xor roo t x xor roo t x xor roo t ...