A
略
B
考虑两个栈合并,第二个栈的贡献可以直接算
然后要用第二个栈的
min
\min
min 去找到第一个
<
<
< 它的位置算贡献
枚举这个位置算
>
>
> 它的
min
\min
min 有多少个就可以了
C
注意到每次就是抠出来一个集合
S
S
S,它的补集填一种颜色
首先这样操作一定是合法的(充分性)
下面证必要性:只需证明合法的染色方案一定存在
z
z
z 使得包涵
z
z
z 的集合为同一种颜色
若不存在
z
z
z,设
U
U
U 为全集且为黑色,那么我们考虑所有为白色的集合
由于包涵
z
z
z 的集合中两个颜色都有,所以
U
U
U 一定为白色
那么基于这个进行
D
P
\mathcal{DP}
DP 就可以了
D
注意到第一次出现的位置单调不降
设
a
x
,
b
x
a_x,b_x
ax,bx 为
x
x
x 在两个序列里最后出现的位置
那么若
a
x
>
b
x
a_x>b_x
ax>bx 则不合法
若
b
b
b 中有
a
a
a 中没有的数那么不合法
我们从后往前构造,此时将
a
i
a_i
ai 变成
b
i
b_i
bi
容易知道
i
i
i 之后一定有个
a
j
=
b
i
a_j=b_i
aj=bi
所以我们可以把
i
i
i 之前的
a
i
a_i
ai 都变成
b
i
b_i
bi 然后把
a
i
a_i
ai 变成
b
i
b_i
bi
A
容易发现答案为
a
1
−
a
2
a_1-a_2
a1−a2
归纳,若最先合并
a
n
−
1
,
a
n
a_{n-1},a_n
an−1,an 或者不是,二者是对称的
B
一位一位确定,设当前有
c
c
c 个
p
i
=
i
p_i=i
pi=i,有
t
t
t 个没有填的
>
i
>i
>i 的
c
←
m
−
c
c\leftarrow m-c
c←m−c
先钦定
(
t
c
)
\binom{t}{c}
(ct) 然后相当于是
t
−
c
t-c
t−c 个可以
p
i
=
i
p_i=i
pi=i 放
n
−
i
−
c
n-i-c
n−i−c 个空位
设
j
j
j 个
p
i
p_i
pi 可以
=
i
=i
=i 的放
i
i
i 个空位的方案数为
F
i
,
j
F_{i,j}
Fi,j
F
i
,
j
=
∑
k
≤
j
(
j
k
)
(
i
−
k
)
!
(
−
1
)
k
=
∑
k
≤
j
(
j
−
1
k
)
(
i
−
k
)
!
(
−
1
)
k
+
∑
k
(
j
−
1
k
−
1
)
(
i
−
k
)
!
(
−
1
)
k
=
F
i
,
j
−
1
+
∑
k
(
j
−
1
k
)
(
i
−
1
−
k
)
!
(
−
1
)
k
+
1
=
F
i
,
j
−
1
−
F
i
−
1
,
j
−
1
F_{i,j}=\sum_{k\le j}\binom{j}{k}(i-k)!(-1)^k\\=\sum_{k\le j}\binom{j-1}{k}(i-k)!(-1)^k+\sum_{k}\binom{j-1}{k-1}(i-k)!(-1)^k\\=F_{i,j-1}+\sum_{k}\binom{j-1}{k}(i-1-k)!(-1)^{k+1}=F_{i,j-1}-F_{i-1,j-1}
Fi,j=∑k≤j(kj)(i−k)!(−1)k=∑k≤j(kj−1)(i−k)!(−1)k+∑k(k−1j−1)(i−k)!(−1)k=Fi,j−1+∑k(kj−1)(i−1−k)!(−1)k+1=Fi,j−1−Fi−1,j−1
故
F
i
,
j
=
F
i
−
1
,
j
+
F
i
,
j
+
1
F_{i,j}=F_{i-1,j}+F_{i,j+1}
Fi,j=Fi−1,j+Fi,j+1
C
考虑
r
=
n
r=n
r=n 怎么做,容易发现最大匹配为
min
(
a
,
b
)
\min(a,b)
min(a,b),
a
,
b
a,b
a,b 为左右非零度点个数
于是可以做背包
O
(
n
2
m
2
)
\mathcal{O}(n^2m^2)
O(n2m2)
考虑如何最小化最大匹配,由
H
a
l
l
\mathcal{Hall}
Hall 定理,最大匹配为
n
+
min
S
(
∣
N
(
S
)
∣
−
∣
S
∣
)
n+\min_S(|N(S)|-|S|)
n+minS(∣N(S)∣−∣S∣)
我们现在知道每个点的度数,要构造一个图使最大匹配最小
那么我们一定会选左边几个度数最小的点,找到右边几个度数最大的点连过去
记
d
(
S
)
d(S)
d(S) 为集合
S
S
S 的度数和
即
n
+
min
S
,
T
(
∣
T
∣
−
∣
S
∣
∣
d
(
S
)
≤
d
(
T
)
)
n+\min_{S,T}(|T|-|S|\mid d(S)\le d(T))
n+minS,T(∣T∣−∣S∣∣d(S)≤d(T))
容易发现只需要在背包里面记录
∣
S
∣
,
d
(
S
)
|S|,d(S)
∣S∣,d(S)
因为最优解一定可以取到且非法解一定不会取到
复杂度
O
(
n
3
m
3
)
\mathcal{O}(n^3m^3)
O(n3m3)
D
考虑倍增,要用
7
k
7k
7k 次
注意到找到最大的
t
t
t 使得
2
t
2^t
2t 查出来是
2
t
2^t
2t 但
2
t
+
1
2^{t+1}
2t+1 查出来不是
那么
2
t
+
1
2^{t+1}
2t+1 查出来的就是答案,二分一下只用
3
k
3k
3k 次