題目傳送門
(這次英語題應該比較好懂吧……)
大意是
給定一棵有n貌似很像不虛就是要ak?nn個點的樹,每個點有權值v
iv_i
vi,求是否存在一條路徑使得路徑上所有點的權值的乘積mod
106+
3\bmod 10^6+3
mod106
+3為k
kk,輸出路徑首尾編號,若有多解輸出字典序最小的解。
現在求路徑上點權的乘積,繼續點分治,怎麼合併答案?
我們已經統計出一棵子樹到重心的權值積了,因為這些乘積m
mm對mod
\text
mod取余為k
kk,再加入的子樹的乘積就應為k×m
−1
k\times m^
k×m−
1,所以需要求逆元。
如何確定樹上合法的兩點?在統計乘積時需要記錄一下位置,在加入子樹時就可以合併了,利用這個更新答案,然後將這些點插入雜湊表中,待下次加入子樹時備用。
時間複雜度為o(t
nlog2
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...