1. 程式人生 > 其它 >CF1513F Swapping Problem(巧妙轉化為曼哈頓距離+線段樹)

CF1513F Swapping Problem(巧妙轉化為曼哈頓距離+線段樹)

給出一個n,和兩個長度為n的陣列a和b。

最多交換一次b中的兩個位置

最小化\(\sum_{i=1}^n|a_i-b_i|\)

做法:

對於原陣列,記\(x_i=|a_i-b_i|\)

考慮交換\(i,j\)\(b\)值,那麼差值為\(|a_i-b_j|+|b_i-a_j|-x_i-x_j\)

這個柿子,等價於對平面上\((a_i,b_i)\)\((b_j,a_j)\)這兩個點求曼哈頓距離,再減去兩個點各自的點權w,要讓柿子的值最小。

對單獨一個點,討論周圍四個象限的點。

對一個點i,討論x值小於它的且y值小於它的點j:

\(x_i-x_j+y_i-y_j-w_i-w_j\)

這個柿子移項有:

\(x_i+y_i-w_i-x_j-y_j-w_j\)

即對一個矩形內的點求最小值。

可以從小到大列舉x座標,對當前點,查詢線段樹內的\([1,y]\)這個區間的\(x_j+y_j+w_j\)的最大值。

對一個點i,討論x值小於它的且y值大於它的點j:

\(x_i-x_j+y_j-y_i-w_i-w_j\)

這個柿子移項有:

\(x_i-y_i-w_i-(x_j-y_j+w_j)\)

同樣可以從小到大列舉x座標,對當前點,查詢線段樹內\([y+1,mm]\)這個區間的

\(x_j-y_j+w_j\)的最大值。

對一個點i,討論x值大於它的且y值小於它的點j:

\(x_j-x_i+y_i-y_j-w_i-w_j\)

這個柿子移項有:

\(-x_i+y_i-w_i-(-x_j+y_j+w_j)\)

可以從大到小列舉x座標,對當前點,查詢線段樹內\([1,y]\)這個區間的\(-x_j+y_j+w_j\)的最大值。

對一個點i,討論x值大於它的且y值大於它的點j:

\(x_j-x_i+y_j-y_i-w_i-w_j\)

移項有:

\(-x_i-y_i-w_i-(-x_j-y_j+w_j)\)

同樣可以從大到小列舉x座標,對當前點,查詢線段樹內\([y+1,mm]\)這個區間\(-x_j-y_j+w_j\)的最大值。

因此可以跑四遍這樣的過程,就做完了。