題意:給 \(p\) 和 \(p-1\) 個邊權,要用這些邊權構造樹,每個點編號 \(0\sim p-1\),使得每個點 \(u\) 到 \(0\) 的距離 \(\bmod\ p=u\),無解輸出 -1,保證 \(p\) 是質數、\(p\le 10^6\)、邊權 \(\in [1..p-1]\).
Solution
考慮加邊的過程,樹最開始只有根節點 0,然後透過加邊不斷地引入新的點
首先一定是有解的,證明:若邊 \(x\) 不能被加入,則 \(\forall\) 樹上的點 \(y\),\(y+x\) 也在樹上(否則就有機會讓該邊加入),又因為 \(p\) 為質數,推出所有點都在樹上,矛盾.
對於一個邊權 \(x\),我們想找到一個 \(k\),使得 \(kx\bmod p\) 在樹上,且 \((k+1)x\bmod p\) 不在樹上,這樣我們可以連線這兩個點.
怎麼找呢?考慮用一個奇怪的二分,滿足 \(l\cdot x\bmod p\) 總是在樹上,\(r\cdot x\bmod p\) 總是不在樹上,\(l+1=r\) 時就停止;
每次判斷 \(mid\cdot x\bmod p\) 是否在樹上,若不是就 \(r\gets mid\),否則 \(l\gets mid\).
這樣距離每次減半,時間複雜度 \(O(p\log p)\).
這樣的二分很神奇,他不需要任何單調性,只需要 \(l\) 和 \(r\) 過程中一直滿足某種相反的性質即可,最終能找到一組相鄰的性質相反的位置.