A
題意:給出一棵樹,斷兩條邊分成三份 \(a, b, c\),最小化 \(\max (a, b, c) - \min(a, b, c)\)。
一個自然的想法是列舉 \(x\),斷掉 \((x, fa)\),在剩餘部分儘可能均分。
對於不是 \(x\) 祖先的點,找大小最靠近 \(\frac{n - sz_x}{2}\);對於 \(x\) 的祖先,找最靠近 \(sz_x + \frac{n - sz_x}{2}\) 的。submission
另解:隨機一個根,啟發式合併找子樹內 size 內最接近 \(\frac{sz_x}{2}\) 的,對應斷 \((x, fa)\) 再在子樹內斷一刀。效率不會分析。
B
題意:\(1 \sim n\) 順次排列,每次等機率選出兩個相鄰的人 \(i, j\),\(i\) 贏的機率為 \(\frac{a_i}{a_i + a_j}\),\(j\) 贏的機率為 \(\frac{a_j}{a_i + a_j}\),贏的人繼續留在場上。
求第 \(k\) 個人最後獲勝的機率。\(n \le 500\)。
設 \(f(i, j, k)\) 表示只考慮區間 \([i, j]\),\(k\) 獲勝的機率。由於不需要考慮每一回合的發生順序,\(f(i, j, k ) = f(i, k, k)\times f(k, j, k)\)。
不能由上述表示式求出的情況只有 \(f(i, j, i)\) 和 \(f(i, j, j)\),記作 \(l(i, j)\) 和 \(r(i, j)\)。
以 \(l(i, j)\) 為例,肯定是把 \([i + 1, j]\) 拆成若干區間,每個區間的勝者與 \(i\) 比賽,設最後一個區間 \([k, j]\),列舉勝者 \(p\):
最後一個區間長為 \(a\) 且 \(p\) 獲勝的機率是多少?不妨先考慮每一回合的順序,一個人被刪除則加到末尾,最後能得到一個排列。
總共 \((j - i)!\) 種排列,先把 \(p\) 放到末尾,剩下 \(j - i - 1\) 個人隨便排,機率等於 \(\dfrac{1}{j - i}\),與 \(a\) 無關。
後面一個和式只與 \(i, p\) 有關,dp 同時算一下貢獻,做到 \(O(n)\) 轉移。時間複雜度 \(O(n^3)\)。submission
C
題意:\(n\) 行 \(m\) 列的網格,左下角為 \((0, 0)\),右上角為 \((m, n)\),保證 \(2\nmid m \land n\perp m\)。
若干格子(非格點)中有方塊,給出 \(k\) 個方塊的右上角左邊。初始位置在 \((\frac{m}{2}, 0)\),初始方向向量 \((-1, 1)\)(左上)。
撞到邊界或方塊發生反射,一個方塊被撞到會立刻消失。求所有方塊消失的時刻,資料保證有解。\(n, m, k \le 10^5\)。
能從 \((x_0, y_0)\) 直接撞到一個方塊當且僅當 \(x + y\) 或 \(x - y\) 相同,這取決於當前方向,分討一下。
複雜度瓶頸在於從一個方塊到下一個方塊有可能經過 \(O(n)\) 個邊界點。
如果 \(x, y\) 都是邊界點,\(x\) 從這個方向射到 \(y\), 下一次延這個方向還是到 \(y\)。並查集壓縮路徑,複雜度 \(O(n\log n + n\alpha(n))\)。
程式碼不會寫,碼力太弱。
D
題答題: