G Deblo(樹上邊異或和)

2021-09-13 12:31:46 字數 1523 閱讀 8118

原題:

題意:

樹上點權,一條邊的值為樹上所有點權的異或。求所有邊的值之和。

解析:

將值拆成二進位制位,記錄每個二進位制位出現的次數。例如有三條邊權的二進位制分別為: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個結點。樹的每條邊上...