zoukankan      html  css  js  c++  java
  • 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)的最大值。

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

  • 相关阅读:
    webservice底层使用Socket进行网络调用
    jquery事件绑定
    C#连接PostgreSQL查询中文字符出现乱码情况
    Engine加载ArcGIS Online和ArcGIS Server发布的地图服务
    【转载】MFC中tabcontrol控件的使用
    一、VS2010创建一个MFC项目
    二、VS2012配置OpenCV
    三、编译和配置GDAL
    Python调用百度地图API(路线规划、POI检索)
    【转载】Python操作Excel的读取以及写入
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/15477994.html
Copyright © 2011-2022 走看看