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\)的最大值。

因此可以跑四遍这样的过程,就做完了。

posted @ 2021-10-28 22:10  zlc0405  阅读(43)  评论(0编辑  收藏  举报