關於樹上路徑異或和的思考
關於樹上路徑異或和的思考
做樹上路徑異或時突發想到了一個問題,怎麼求樹上路徑異或和之和,但是沒找到題目。
大概思路:
1.樹形 d p dp dp求出從根出發的路徑異或和 d p [ u ] dp[u] dp[u]。
2.顯然我們需要的最終結果就是:
∑
d
p
[
i
]
⊕
d
p
[
j
]
(
1
≤
i
<
j
≤
n
)
\sum dp[i]\oplus dp[j] (1\le i<j\le n)
∑dp[i]⊕dp[j](1≤i<j≤n)。
當
n
≤
1
0
5
n\le 10^5
n≤105 顯然不能暴力。
3.考慮每一位的貢獻。
設
c
n
t
[
i
]
cnt[i]
cnt[i]表示第
i
i
i位出現了多少次
1
1
1,則0出現的次數為
n
−
c
n
t
[
i
]
n-cnt[i]
n−cnt[i]。
由乘法原理,可得到該位的貢獻為:
c
n
t
[
i
]
×
(
n
−
c
n
t
[
i
]
)
×
2
i
cnt[i]\times (n-cnt[i])\times 2^i
cnt[i]×(n−cnt[i])×2i。
最後求和可得
a
n
s
=
∑
i
=
0
31
c
n
t
[
i
]
×
(
n
−
c
n
t
[
i
]
)
×
2
i
ans=\sum\limits_{i=0}^{31}cnt[i]\times (n-cnt[i])\times 2^i
ans=i=0∑31cnt[i]×(n−cnt[i])×2i
這個問題還可以有很多變形,比如求路徑異或和為偶數的和,路徑異或和為奇數的和。
對於路徑異或和為奇數,顯然一個
d
p
[
i
]
,
d
p
[
j
]
dp[i],dp[j]
dp[i],dp[j]最低位不相同即可,所以可以考慮把結點分成兩堆,一堆為奇數,一堆為偶數。
然後開個陣列
a
[
]
[
2
]
,
b
[
]
[
2
]
a[][2],b[][2]
a[][2],b[][2],再按位計算貢獻。
a
n
s
=
∑
i
=
0
31
(
a
[
i
]
[
0
]
×
b
[
i
]
[
[
1
]
+
a
[
i
]
[
1
]
×
b
[
i
]
[
0
]
)
×
2
i
ans=\sum\limits_{i=0}^{31} (a[i][0]\times b[i][[1]+a[i][1]\times b[i][0])\times 2^i
ans=i=0∑31(a[i][0]×b[i][[1]+a[i][1]×b[i][0])×2i
偶數的話,就用上面的答案 − - −去奇數的和,或者還是分成兩堆同理算。
求路徑異或和是
k
k
k的個數。
開個桶記錄,如果數較大,就用
m
a
p
map
map。
求路徑異或和是 k k k的倍數的個數。
呃,變成點分治題目了。
相關文章
- P4551 最長異或路徑(樹上字首異或01-trie)
- 關於Fork和Malloc的思考
- 關於前端指令碼異常監控的思考前端指令碼
- 演算法之字首樹——最大異或和演算法
- 樹莓派控制調速以及關於PWM的思考樹莓派
- 關於重寫equals()和hashCode()的思考
- Flutter異常監控 - 伍 | 關於異常監控框架設計的思考Flutter框架
- P4551 最長異或路徑
- 關於主資料的實踐和思考
- 關於程式碼版本管理的思考和建議
- 關於難點的思考
- 關於面試的思考面試
- 關於DDD和COLA的一些總結和思考
- 關於JS的物件導向的思考和總結JS物件
- 一道關於二叉樹的位元組面試題的思考二叉樹面試題
- 關於2021年的一些收穫和思考
- 關於遞迴和回溯的一次深入思考遞迴
- 關於點贊業務對MySQL和Redis和MongoDB的思考MySqlRedisMongoDB
- 關於限流實現的思考
- 關於中介軟體的思考
- 關於Flux,Vuex,Redux的思考VueRedux
- 關於工廠模式的思考模式
- 關於寫部落格的思考
- 關於軟體架構和業務架構的思考架構
- 關於 GIN 的路由樹路由
- 樹的直徑
- 關於近期幣安事件的思考事件
- 關於 Method Swizzling 的一點思考
- 關於同步的一點思考-下
- 關於 PHP 框架的簡單思考PHP框架
- 關於研發效能提升的思考
- 關於運營邊界的思考
- 關於CodeReview的一些思考View
- 關於git flow的一點思考Git
- 關於知識付費的思考
- 最近關於工作的幾點思考
- iOS關於換膚和夜間模式的一些思考iOS模式
- 關於壓力測試中 TPS 和併發數的思考