對於異或,就是將之前的求和的+號改為^ 即可 其他完全一樣
1 #include2using
namespace
std;
3 typedef long
long
ll;4
const
int maxn=200000+10;5
intn,m,r;6//
見題意7
intw[maxn],wt[maxn];8//
鏈式前向星陣列,w、wt初始點權陣列
9int
son[maxn],id[maxn],fa[maxn],cnt,dep[maxn],siz[maxn],top[maxn];
10//
son重兒子編號,id新編號,fa父親節點,cnt dfs_clock/dfs序,dep深度,siz子樹大小,top當前鏈頂端節點
11//
查詢答案
12struct
node
13g[maxn<<2]; int head[maxn]; int
num;
16struct
tre17
tree[maxn<<2
];21
void add(int u,int v,int
w)22
26void build(int l,int r,int
root)
37int mid=l+r>>1
;38 build(l,mid,root<<1
);39 build(mid+1,r,root<<1|1
);40 tree[root].sum=tree[root<<1].sum^tree[root<<1|1
].sum;41}
4243
int query(int l,int r,int
root)
48int mid=l+r>>1;49
int ans=0;50
if(l<=mid) ans^=query(l,r,root<<1
);51
if(r>mid) ans^=query(l,r,root<<1|1
);52
return
ans;53}
5455
void dfs1(int u,int f,int deep)68}
6970
void dfs2(int u,int topf)81}
82int qrange(int x,int
y)89
//直到兩個點處於一條鏈上
90if(dep[x]>dep[y])swap(x,y); //
把x點深度更深的那個點
91if(x!=y)
92 ans^=query(id[x]+1,id[y],1); //
這時再加上此時兩個點的區間和即可
93return
ans;94}
95void
init()
96100
intmain()
109 dfs1(1,0,1
);110 dfs2(1,1
);111 build(1,n,1
);112
intt;
113 scanf("
%d",&t);
114while(t--)
119return0;
120 }
P2420 讓我們異或吧
p2420 讓我們異或吧異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點...
P2420 讓我們異或吧
異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上有乙個權值...
P2420 讓我們異或吧(倍增)
異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上有乙個權值...