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\)的最大值。
因此可以跑四遍這樣的過程,就做完了。