假如只能交换相邻那就是冒泡,最少步数是逆序对总数。
现在最少步数是逆序对总数减掉操作二消去的逆序对数加上这一次操作本身消耗的一步。
显然操作二要消除尽量多的逆序对。麻烦在消除的逆序对受到的影响比较多。
总之先考虑怎么把消除的逆序对数量比较简单地表示出来。
交换
A
(
a
,
h
a
)
A(a,h_a)
A(a,ha) 和
B
(
b
,
h
b
)
B(b,h_b)
B(b,hb) ?
画个图。假设
a
<
b
a<b
a<b 首先很显然会交换一定要满足
h
a
>
h
b
h_a>h_b
ha>hb 。
进一步思考具体消除的逆序对数量。
显然跟在这两个点框出的矩形里面的点的个数密切相关。
求矩形点数最多是可以可持久化线段树的,比起定义一堆数组来表示要好得多。
假设矩形内(除了
A
A
A 和
B
B
B )点数
x
x
x 。
表示出来:
2
x
+
1
2x+1
2x+1 。千万不要忘记了交换
A
A
A 和
B
B
B 本身就会消除一个逆序对。
设逆序对总数 r r r 。总的步数 a n s = r − 2 x − 1 + 1 ans = r - 2x - 1 + 1 ans=r−2x−1+1 。
交换哪两个点能够消除的逆序对数量最多?
就是说组成的矩形面积最大,这个
O
(
n
2
)
O(n^2)
O(n2) 可以处理。
我们思考我们只有可能选择怎样的矩形。
首先,确定矩形的两个点一定一个在左上,一个在右下;
其次,考虑一下两个同时可能被选择的矩形。如果有包含关系,显然一个可以废掉。
否则,
假如现在选择了矩形
P
2
P
4
P_2P_4
P2P4,那么
S
′
>
S
1
+
S
2
S'>S_1+S_2
S′>S1+S2 即
S
′
>
S
1
S'>S_1
S′>S1。
然后要是
P
1
P_1
P1 的最优决策是跟
P
3
P_3
P3 组矩形那就有
S
1
>
S
′
S_1>S'
S1>S′ ,矛盾了。
所以如果
P
2
P_2
P2 跟
P
4
P_4
P4 最优,那么
P
1
P_1
P1 跟
P
3
P_3
P3 一定不优于跟
P
4
P_4
P4 。
决策单调性。二维数点不能
O
(
1
)
O(1)
O(1),所以用分治。
套路:分治。每次找区间中点对应的最优决策点 。
(貌似也有人把这个决策单调性分治叫做整体二分?不过我局得这个不是太整体二分⑧)
(应该没有人觉得决策单调性分治是指带权二分吧。。。)
这道题首先上面谈到的决策单调性形成两组数,矩形左上顶点
{
a
n
}
\{a_n\}
{an},矩形右下顶点
{
b
m
}
\{b_m\}
{bm}。
这两组数是唯一的。所以可以预处理。
分治的时候有两个区间,分别对应了现在正在处理的,两组数里面的两个区间。
我们给其中的一个区间(记为
x
x
x)的中点寻找它在另一个区间(记为
y
y
y)的最优决策。
找到之后把
x
x
x 按照中点分成两块,把
y
y
y 按照最优决策点也分成两块,就可以传下去。
静态逆序对是套路了。二维数点用扫描线或者可持久化都可以。
复杂度是分治套二维数点的复杂度
O
(
n
l
o
g
2
n
)
\mathcal O(nlog^2n)
O(nlog2n) 。
另一种思路:
扫描线套数据结构可以直接暴力二维数点。
但是这道题的点是数,矩形是可能被交换的数对;如果考虑一个数会对哪些交换产生影响呢?
(思维氵化的我就想不到这个,直接暴力二维数点)
从点的贡献入手做一个转化,把点和矩形调转。一个点能够对哪个范围内的矩形产生贡献?
对矩形产生贡献不太现实。然而这里的矩形并不好转化成其覆盖的某一个点。
考虑矩形,它是由两个点围成的,唯一可行的方式就是把这两个点转化成两个坐标。
那现在问题就是一个点的矩形里面覆盖了多少个矩形的点(
因为现在矩形已经被消掉不可能产生贡献的那些了,左上端点和右下端点的坐标都应该单调。
所以就不难处理一个点一定会且仅会被哪些矩形覆盖。
只需要找到在它左边比它大的最小数和在它右边比它小的最小数。
这两个数在新的坐标轴内围成一个矩形。这样的话就转化成了矩形覆盖的点数。
就可以扫描线了。
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) 。
代码:飞了。等一个填坑