題目描述
異或是一種神奇的運算,大部分人把它總結成不進製加法.
在生活中…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 ...