W
Q
S
WQS
WQS二分 最初由 王钦石(
w
q
s
wqs
wqs) 在
2012
2012
2012 年提出的,
后来自
I
O
I
2016
IOI2016
IOI2016 的
A
l
i
e
n
s
Aliens
Aliens 题目开始,
这种方法逐步在竞赛圈中有了一定的地位。
一般适用范围
W Q S WQS WQS二分通常用以解决以下这类问题:
给定 n n n 个物品,要求从中恰好选择 m m m 次,最大化/最小化 选出物品的权值之和。
注意:上面的 “选择 m m m 次” 不一定是选择 m m m 个物品,要因题而异。
使用条件
设 g ( i ) g(i) g(i) 为选 i i i 次(可以适当理解为:选 i i i 个物品)的最优答案,将所有的 ( i , g ( i ) ) (i,g(i)) (i,g(i)) 这样的点在平面直角坐标系中表示出来,必须组成一个凸包(上凸包,下凸包均可)。
此类题目的特点
- 若没有限制选择的次数,则题目比较好求;
- 选的次数越多,则权值之和越 大/小。
判断是否能使用的方法
- 打表——拟出 ( i , g ( i ) ) (i,g(i)) (i,g(i)) 这些点所构成的图形是否为凸包;
- 自行判断——是否符合 “此类题目的特点”。
算法思路
一般这类题目都可以从
D
P
DP
DP 入手。
设
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示到第
i
i
i 个物品为止,一共做了
j
j
j 次选择。
显然,这样的时间复杂度为
O
(
n
m
)
O(nm)
O(nm) ,很大可能会超时。
但,我们发现他满足 “此类题目的特点”,即:
- 可形成一个凸包,所以斜率单调 递增/递减;
- 若没有限制选择的次数 m m m ,则题目比较好求。
所以,我们可以使用 W Q S WQS WQS二分了!
W
Q
S
WQS
WQS二分的时间复杂度为:
O
(
n
l
o
g
V
)
O(nlogV)
O(nlogV) 。
注:
V
V
V 表示单个物品的最大权值。
具体的算法分析可点这里!(本人还不是很理解斜率,暂时写不出来)
一些解释
- 切线:凸包中的圆心到圆上的某个点的线段,并过这个点所做的关于这条线段的垂线,是这个点的切线;
- 二分斜率时,得到当前斜率的截距最优的一条直线可能会切到的不只是一个点而是一段点,我们一般会选择这段点中最优的一个点(这个点跟二分有很大关系),可能是这段点中的第一个点。这也就是为什么 m i d mid mid 时最优点 < m <m <m ; m i d + 1 mid+1 mid+1 时最优点 > m >m >m。