[XXI Open Cup.Grand Prix of Korea]Advertisement Matching
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[XXI Open Cup.Grand Prix of Korea]Advertisement Matching相关的知识,希望对你有一定的参考价值。
Advertisement Matching
题解
首先,题目的
a
,
b
a,b
a,b匹配显然是一个很常见的贪心。
有结论,设
a
a
a的集合为
A
A
A,如果
∀
S
⊆
A
,
∑
a
i
∈
S
a
i
⩽
∑
i
=
1
m
min
(
b
i
,
∣
S
∣
)
\\forall S\\subseteq A,\\sum_{a_{i}\\in S}a_{i}\\leqslant \\sum_{i=1}^{m}\\min(b_{i},|S|)
∀S⊆A,∑ai∈Sai⩽∑i=1mmin(bi,∣S∣),那么一定存在一种匹配的方法,使得该题的要求成立。
这也就是Gale–Ryser theorem,这里有一种通过网络流的证明,我个人是通过类贪心的思想理解的。
证明:
该结论的必要性是显然的,我们只需要证明其的充分性,也就是满足上面结论时一定有解。
具体来说,由于对于相同的 ∣ S ∣ |S| ∣S∣,后面的 ∑ i = 1 m min ( b i , ∣ S ∣ ) \\sum_{i=1}^{m}\\min(b_{i},|S|) ∑i=1mmin(bi,∣S∣)的值肯定是一定的。
而前面 ∑ a i ∈ S a i \\sum_{a_{i}\\in S}a_{i} ∑ai∈Sai的最大时肯定是选择 A A A集合中最大的几个数,我们只需要让这些数的和小于我们后面的值就行了。
如果该集合中的最小值,该式不成立,那显然是不行的,我们不妨假定我们去掉最小值时是成立的,现在要将这个最小值加进去。
我们可以将原来的图形根据 min ( b i , ∣ S ∣ ) \\min(b_{i},|S|) min(bi,∣S∣)想象成柱状图,我们现在新加入一个数,肯定有几个柱子会被拔高,而我们的限制是一个柱子最多只能选择一个位置染色。
如果最开始的柱状图就空出一行及以上,如果新加入的 a i ⩽ m a_{i}\\leqslant m ai⩽m,显然是有位置的,如果 a i > m a_{i}> m ai>m,之前的肯定也比 m m m大,那之前就判无解了。
否则,如果没有空出一行以上,而我们让延伸的延伸,此时的空位个数肯定不会小于 a i a_{i} ai,如果,能填满就填,不能填满,肯定是有新延伸的空位原来也是空位。
注意,现在还在延伸的位置,之前肯定也是在延伸的,故之前必然是有一个 a i a_{i} ai覆盖了没有延伸的位置,却没有覆盖新延伸的位置,我们可以让它覆盖的位置改变一下,将覆盖没有延伸位置的地方改成覆盖延伸了的为的地方。
由于之前的 a a a都不小于 a i a_{i} ai,所以我们一定可以通过这种方法调整到让 a i a_{i} ai有位置可填。
这样就可以证明该式的充分性了。
证明了上面的结论,我们自然也就想到了如何维护原题是否可行的方法。
我们可以先将
a
a
a值排序,保证我们选择的
S
S
S大小固定时,我们所选择的
a
a
a的和是最大的。
此时,如果
∀
k
∈
[
1
,
n
]
,
∑
i
=
1
m
min
(
b
i
,
k
)
−
∑
i
=
1
k
a
i
⩾
0
\\forall k\\in[1,n],\\sum_{i=1}^{m}\\min(b_{i},k)-\\sum_{i=1}^{k}a_{i}\\geqslant 0
∀k∈[1,n],∑i=1mmin(bi,k)−∑i=1kai⩾0成立,那么我们是一定有解的,否则一定无解。
我们显然可以通过线段树维护不同的
k
k
k的值,如果
min
k
=
1
n
(
∑
i
=
1
m
min
(
b
i
,
k
)
−
∑
i
=
1
k
a
i
)
⩾
0
\\min_{k=1}^{n}\\left(\\sum_{i=1}^{m}\\min(b_{i},k)-\\sum_{i=1}^{k}a_{i}\\right)\\geqslant 0
mink=1n(∑i=1mmin(bi,k)−∑i=1kai)⩾0,就有解。
如果
b
i
+
1
b_{i}+1
bi+1,显然会让
k
⩾
b
i
+
1
k\\geqslant b_{i}+1
k⩾bi+1的部分,上式的值
+
1
+1
+1。
而
b
i
−
1
b_{i}-1
bi−1则会让
k
⩾
b
i
k\\geqslant b_{i}
k⩾bi的部分,上式
−
1
-1
−1。
由于我们
b
b
b的加值是取的
min
(
b
i
,
k
)
\\min(b_{i},k)
min(bi,k),这是显然的。
而
a
i
a_{i}
ai的改变则涉及到了该元素的
r
k
rk
rk,记
r
k
x
rk_{x}
rkx表示大于等于
x
x
x的数的个数。
如果
a
i
+
1
a_{i}+1
ai+1,那么
k
⩾
r
k
a
i
+
1
+
1
k\\geqslant rk_{a_{i}+1}+1
k⩾rkai+1+1的部分,上式值会
+
1
+1
+1,再让
r
k
a
i
+
1
+
+
rk_{a_{i}+1}++
rkai+1++。
而
a
i
−
1
a_{i}-1
ai−1,会让
k
⩾
r
k
a
i
k\\geqslant rk_{a_{i}}
k⩾rkai的部分值
−
1
-1
−1,再让
r
k
a
i
−
−
rk_{a_{i}}--
rkai−−。
以上的四种操作都是线段树上区间的修改,我们只用看修改完的的最小值就行了。
时间复杂度
O
(
n
+
m
+
q
log
以上是关于[XXI Open Cup.Grand Prix of Korea]Advertisement Matching的主要内容,如果未能解决你的问题,请参考以下文章 [XXI Open Cup,Grand Prix of Tokyo]Ascending Matrix 2019-2020 XX Open Cup, Grand Prix of Korea XX Open Cup, Grand Prix of Tokyo 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2 Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场) 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数