题意是求
m
a
x
(
(
a
[
j
]
+
a
[
i
]
)
∗
(
j
−
i
)
)
,
1
≤
i
<
j
<
n
max({(a[j] + a[i]) * (j - i)}), 1 \le i <j<n
max((a[j]+a[i])∗(j−i)),1≤i<j<n
可转化为求
m
a
x
(
(
a
[
j
]
−
(
−
a
[
i
]
)
)
∗
(
j
−
i
)
)
max({(a[j] - (-a[i])) * (j - i)})
max((a[j]−(−a[i]))∗(j−i))
令
b
[
i
]
=
−
a
[
i
]
b[i] = - a[i]
b[i]=−a[i]
即变为求
m
a
x
(
(
a
[
j
]
−
b
[
i
]
)
)
∗
(
j
−
i
)
)
max({(a[j] - b[i])) * (j - i)})
max((a[j]−b[i]))∗(j−i))
以
i
i
i为横坐标,
b
[
i
]
b[i]
b[i]为纵坐标, 同样以
j
j
j 为横坐标, 以
a
[
j
]
a[j]
a[j]为纵坐标
即
(
a
[
j
]
−
b
[
i
]
)
)
∗
(
j
−
i
)
{(a[j] - b[i])) * (j - i)}
(a[j]−b[i]))∗(j−i) 为点
(
j
,
a
[
j
]
)
(j, a[j])
(j,a[j]) 和点
(
i
,
b
[
i
]
)
(i, b[i] )
(i,b[i]) 组成(对角线)的矩形的面积
即:
首先讨论 a a a 数组
显然在左下的点是不需要的, 即若
a
[
j
]
.
x
<
a
[
i
]
.
x
且
a
[
j
]
.
y
<
a
[
i
]
.
y
a[j].x < a[i].x 且 a[j].y < a[i].y
a[j].x<a[i].x且a[j].y<a[i].y,则将会舍弃
a
[
j
]
a[j]
a[j]
去掉没用的点之后
a
a
a 数组所有点满足 若
a
[
j
]
.
x
<
a
[
i
]
.
x
a[j].x < a[i].x
a[j].x<a[i].x, 则
a
[
j
]
.
y
>
a
[
i
]
.
y
a[j].y > a[i].y
a[j].y>a[i].y, 映射到坐标系中去,
a
a
a数组对应的点应该是这样的
再讨论
b
b
b 数组
显然在右上的点是不需要的, 即若
a
[
j
]
.
x
>
a
[
i
]
.
x
且
a
[
j
]
.
y
>
a
[
i
]
.
y
a[j].x > a[i].x且 a[j].y > a[i].y
a[j].x>a[i].x且a[j].y>a[i].y,则将会舍弃
a
[
j
]
a[j]
a[j]
去掉没用的点之后
a
a
a 数组所有点满足 若
a
[
j
]
.
x
>
a
[
i
]
.
x
a[j].x > a[i].x
a[j].x>a[i].x, 则
a
[
j
]
.
y
<
a
[
i
]
.
y
a[j].y < a[i].y
a[j].y<a[i].y, 映射到坐标系中去,
a
a
a数组对应的点应该是这样的(因为b数组是由a数组取反构造来的,所有所有值都在第四象限)
两个数组画出的点形状一样啊,为什么要分别讨论???
因为对于第一象限的点,横纵坐标越小大越好, 对于某一个点p,如果存在另一个点的横纵坐标都比点p大,那点p就不需要存在, 所以对于第一个可以留下 的点我们就可以存横坐标最大的点,也就是从横坐标大的往小的贪,最后留下可能有贡献的点
同理对于b的点,要从横坐标小到大贪,具体看代码
现在进入决策单调部分
结论: 当 固定
a
[
m
i
d
]
a[mid]
a[mid] 点,如果
b
[
p
o
s
]
b[pos]
b[pos] 是最好的点(即与
a
[
m
i
d
]
a[mid]
a[mid]形成的矩形面积最大)
则:
(1)当
a
[
i
]
.
x
<
a
[
m
i
d
]
.
x
a[i].x < a[mid].x
a[i].x<a[mid].x 时,
a
[
i
]
a[i]
a[i]对应的最优点
b
[
j
]
b[j]
b[j] 满足:
b
[
j
]
.
x
<
=
b
[
p
o
s
]
.
x
b[j].x <= b[pos].x
b[j].x<=b[pos].x
(2)当
a
[
i
]
.
x
>
a
[
m
i
d
]
.
x
a[i].x > a[mid].x
a[i].x>a[mid].x 时,
a
[
i
]
a[i]
a[i]对应的最优点
b
[
j
]
b[j]
b[j]满足:
b
[
j
]
.
x
>
=
b
[
p
o
s
]
.
x
b[j].x >= b[pos].x
b[j].x>=b[pos].x
证明:
对于(1)只需要证明任意
j
,
b
[
j
]
.
x
>
b
[
p
o
s
]
.
x
且
b
[
j
]
.
x
<
a
[
i
]
.
x
j, b[j].x >b[pos].x且b[j].x < a[i].x
j,b[j].x>b[pos].x且b[j].x<a[i].x都有:
(
a
[
i
]
.
y
−
b
[
p
o
s
]
.
y
)
∗
(
a
[
i
]
.
x
−
b
[
p
o
s
]
.
x
)
>
(
a
[
i
]
.
y
−
b
[
j
]
.
y
)
∗
(
a
[
i
]
.
x
−
b
[
j
]
.
x
)
(a[i].y - b[pos].y) * (a[i].x - b[pos].x) > (a[i].y - b[j].y) * (a[i].x - b[j].x)
(a[i].y−b[pos].y)∗(a[i].x−b[pos].x)>(a[i].y−b[j].y)∗(a[i].x−b[j].x)
这只需要画个图就很明了了
对于(2)同理
那么就可以用分治来做这题了
我们对
a
a
a 数组和
b
b
b数组按横坐标进行排序
设定函数
s
o
l
v
e
(
l
1
,
r
1
,
l
2
,
r
2
)
solve(l1,r1,l2,r2)
solve(l1,r1,l2,r2) 求
a
[
l
1
,
r
1
]
与
b
[
l
2
,
r
2
]
a[l1,r1] 与 b[l2,r2]
a[l1,r1]与b[l2,r2] 配对后能得出的最大面积,令
m
i
d
=
(
l
1
+
r
1
)
/
2
mid = (l1 + r1)/2
mid=(l1+r1)/2, 若
b
[
p
o
s
]
b[pos]
b[pos] 为
a
[
m
i
d
]
a[mid]
a[mid] 最优对应点
则
s
o
l
v
e
(
l
1
,
r
1
,
l
2
,
r
2
)
=
m
a
x
(
s
o
l
v
e
(
l
1
,
m
i
d
,
l
2
,
p
o
s
)
,
s
o
l
v
e
(
m
i
d
+
1
,
r
1
,
p
o
s
,
r
2
)
solve(l1, r1, l2,r2) = max(solve(l1, mid, l2, pos), solve(mid + 1,r1, pos, r2)
solve(l1,r1,l2,r2)=max(solve(l1,mid,l2,pos),solve(mid+1,r1,pos,r2)
显然该分治做法是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)复杂度的