原題:
題意:
樹上點權,一條邊的值為樹上所有點權的異或。求所有邊的值之和。
解析:
將值拆成二進位制位,記錄每個二進位制位出現的次數。例如有三條邊權的二進位制分別為:101,111,011,那麼第1位3次,第2位2次,第3位2次。
樹形dp,dp[
i][j
][k]
=v
dp[i][j][k]=v
dp[i][
j][k
]=v表示到第點i
ii,第j
jj位為k
kk的邊的數量為v
vv。因為折線不能往上更新了,所以dpdp
dp記錄的其實是非折線的數量。
對於乙個點f
ff,兒子有u1,
u2,u
3...
u1,u2,u3...
u1,u2,
u3..
.,將u
uu與f
ff各邊的異或記錄,記為u∗f
u*fu∗
f,而算進答案還有ux,
uy,f
u_x,u_y,f
ux,uy
,f三個形成的折線(ux∗
uy∗f
u_x*u_y*f
ux∗uy
∗f)。這個每次u
iu_i
ui與ui−
1∗f,
ui−2
∗f..
.u_*f,u_*f...
ui−1∗
f,ui
−2∗
f...
記錄即可。
這個oj不能bfs太深,所以會re幾個案例
#include
using
namespace std;
const
int n=
1e5+5;
#define ll long long
ll dp[n][35
][2]
;struct node
e[n*2]
;int cnt,head[n]
,a[n]
;void
add(
int x,
int y)
ll ans=0;
void
dfs(
int x,
int fa)}}
intmain()
}for
(int i=
1;i)scanf
("%d%d"
,&x,
&y),
add(x,y)
,add
(y,x)
;dfs(1
,0);
printf
("%lld\n"
,ans)
;return0;
}
Trie 樹上異或路徑的應用
鏈結 給定n個字串s1,s2 sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1 sn中有多少個字串是t的字首。輸入字串的總長度不超過106,僅包含小寫字母。輸入格式 第一行輸入兩個整數n,m。接下來n行每行輸入乙個字串si。接下來m行每行乙個字串t用以詢問。輸出格式 對於每個詢問,輸出乙個整...
異或和之和 異或問題
題目 有n個數,任選3個進行異或,求出所有三元組的異或和的和 普通計算是 o n 3 但是發現,對於異或的運算,就轉換為二進位制的運算,把每乙個陣列轉換為二進位制,再拆分,當且僅當 1 1 1 和 1 0 0 時,答案才為1,否則都是0,也就是說,只有這兩個情況是由貢獻的 把每個數位化為二進位制,然...
洛谷P2420 讓我們異或吧(樹上異或)
題目描述 異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上...