1. 程式人生 > 實用技巧 >CodeChef Sum of distances(分治)

CodeChef Sum of distances(分治)

CodeChef Sum of distances(分治)

題目大意

有一排點,每個點 i 向 \(i + 1, i + 2, i + 3\) 分別連價值為 \(a_i,b_i,c_i\) 的有向邊,問兩兩間最短路之和

資料範圍

\(1 \le n \le 10^5\)

解題思路

這種題已經從新穎變成套路了(唉)

考慮分治,很容易發現如果斷掉連續的三個點那麼圖就不再聯通,我們從中間找三個點,然後分別向兩邊跑最短路,設點 i 到三點最短距離為 \(x_1,x_2,x_3\),三點到 j 最短距離為 \(y_1,y_2,y_3\)

那麼對答案的貢獻為 \(\min(x_1+y_1,x_2+y_2,x_3+y_3)\)

考慮 \(x_1+y_1\) 最小,有

\[x_1+y_1 \le x_2+y_2,x_1+y_1 \le x_3+y_3\\
x_1-x_2 \le y_2-y_1,x_1-x_3 \le y_3-y_1
\]

簡單的二維偏序問題,但實現起來較為複雜,考慮 \(x_2+y_2\) 時注意小於等於號和小於號的情況

程式碼先咕了