[CF1292D]Chaotic V.


昨晚#614div2的F題。我現在看感覺比E題還簡單啊,為什么當時要去死剛E題呢。。。

題目大意:有一棵樹,根節點編號為\(1\),設一個節點的編號\(x(x>1)\),則它的父節點編號為\(x/f(x)\),邊權為1,其中\(f(x)\)\(x\)的最小質因子。現在給定\(n(n<=1000000)\)個編號為\(k_{1}!,k_{2}!,...,k_{n}!(0<=k_{i}<=5000)\)的點,你的任務是在這棵樹 上確定一個點\(p\)使得\(\sum_{i}dis(p,k_{i}!)\)最小,輸出這個最小值。

這棵樹大概就長這個樣子,其中邊緣加粗的點分別是\(1!,2!,3!,4!\)

不妨把這\(n\)個點稱為關鍵點,顯然,\(k_{i}\)相同的關鍵點可以放在一起處理,那么\(n\)的規模退化到5000。
手玩一下發現,\(4!=3*2*2*2\)的位置是這樣確定的:

\[1*3=3,3*2=6,6*2=12,12*2=24 \]

這啟發我們是不是從根節點開始,從大到小依次乘\(x\)的質因子,最后就可以走到\(x\)?這是正確的。
好了,我們可以把\(0!,1!,...,5000!\)先分解一波質因子,就有辦法確定這n個點在樹上的位置關系了。
接下來考慮如何確定點\(p\)
首先欽定\(p=1\),然后嘗試向把\(p\)\(p\)關鍵點最多的子樹移動一步,設移動到\(p'\)

  1. 如果\(p'\)能使答案更小,則\(p=p'\),並重新統計\(p\)的各個子樹關鍵點的數量;
  2. 否則\(p\)就是使答案最小的點,退出循環。

移動一次維護關鍵點數量的復雜度為\(n\),最多移動\(d(n!)\)次,\(d(n!)\)\(n!\)的質因子數,它小於等於\(n!\)的約數個數,而\(n!\)的約數個數為\(nlogn\),因此總的復雜度為\(O(n^2logn)\)。(這里\(n\)的規模為5000)
應該有更低的上界,但無所謂了。
代碼就咕了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM