樹的點分治 HDU4812 D Tree

2021-08-03 06:29:01 字數 651 閱讀 8770

題目傳送門

(這次英語題應該比較好懂吧……)

大意是

給定一棵有n

nn個點的樹,每個點有權值v

iv_i

vi​,求是否存在一條路徑使得路徑上所有點的權值的乘積mod

106+

3\bmod 10^6+3

mod106

+3為k

kk,輸出路徑首尾編號,若有多解輸出字典序最小的解。

貌似很像不虛就是要ak?

現在求路徑上點權的乘積,繼續點分治,怎麼合併答案?

我們已經統計出一棵子樹到重心的權值積了,因為這些乘積m

mm對mod

\text

mod取余為k

kk,再加入的子樹的乘積就應為k×m

−1

k\times m^

k×m−

1,所以需要求逆元。

如何確定樹上合法的兩點?在統計乘積時需要記錄一下位置,在加入子樹時就可以合併了,利用這個更新答案,然後將這些點插入雜湊表中,待下次加入子樹時備用。

時間複雜度為o(t

nlog⁡2

2n

)o(tn\log_2^2n)

o(tn

log22​

n)。code

HDU4812 D Tree(樹的點分治)

題目大概說給一棵有點權的樹,輸出字典序最小的點對,使這兩點間路徑上點權的乘積模1000003的結果為k。樹的點分治搞了。因為是點權過根的兩條路徑的lca會被重複統計,而注意到1000003是質數,所以這個用乘法逆元搞一下就ok了。還有要注意 治 的各個實現,把時間複雜度 控制 在o nlogn wa...

HDU 4812 D Tree 點分治 逆元

題目要求在樹上找到一條鏈使得這條鏈上的點的乘積模mod等於k,求鏈首尾字典序最小的一條 看到題目就能知道是乙個點分治的題目,將樹按照重心分治之後,就是要統計以重心為根的子樹中,過樹根的mod為k的鏈字典序最小的一條,這裡的統計必需是在時間複雜度o n 以下才能過 pragma comment lin...

樹的點分治

codeforces 150e 通過點分治以及合併子樹檢查二分的答案 用深度從小到大的方式可以剪枝,達到nlog 2 n 的複雜度 不離散化常數巨大,離散化常數依然巨大 include include include include include define maxn 100005 define...