题意简述
给定两个数列,长度均为,中的数都互不相同。最小化每个数差的平方的和,形式化地,最小化:
然后输出交换次数对取膜的结果。
思路框架
显然,最优的时候就是都排好序的时候,那么我们把离散化,都看成的排列,然后算需要多少步到。是一个类似逆序对的问题,用树状数组维护即珂。
具体思路
先化简一下那个式子。把平方拆开,会发现变成三个部分:
- 的和
- 的和
- 的和
要让原式最小,那就要让的和最大。如何最大呢?那肯定是要排序之后一一对应。
but…Why?
只考虑的情况。设有四个数,,满足且。然后我们看看是大还是大,就珂以证出来上面那个排序了。
作差,得。由于两个都是负的,所以这个数大于。所以比大。证毕。
然后我们要求的问题就是,我们要让和一一对应,也就是的第一小对应的第一小,的第二小对应的第二小…的最大值对应的最大值。
(要解决这个问题,显然要先离散化
我们来分析一下我们的目的是啥。比如。然后我们要让中的排在第一个,中的排在第二个…中的排在第个。然后我们先处理出的反排列,设为,那么对于所有,。然后对于每个,我们令。这样,我们就把中的第个位置变成了这个位置在最优情况下应该在哪。
现在,我们的目的就变成了变换后的排列变成的最小交换次数。这就是变换后的排列的逆序对数量。树状数组维护即珂。
(上面说这么多,代码其实不长)
实现注意
- 交换次数要
代码
1 |
|