content
A. Review Site
点点点
B. GCD Length
点点点
C. Yet Another Card Deck
点点点
D. Min Cost String
题意:
给定字符串长度
n
(
1
⩽
n
⩽
2
⋅
1
0
5
)
n\left(1\leqslant n\leqslant 2\cdot10^5\right)
n(1⩽n⩽2⋅105)和字符种类数量
k
(
1
⩽
k
⩽
26
)
k\left(1\leqslant k\leqslant 26\right)
k(1⩽k⩽26)。构造字符串,求最少的
s
i
=
s
j
&
s
i
+
1
=
s
j
+
1
s_i = s_j\ \&\ s_{i + 1} = s_{j + 1}
si=sj & si+1=sj+1的
i
,
j
i, j
i,j对数。
题解:
贪心,易知
a
a
b
a
.
.
.
z
b
b
c
b
.
.
.
z
c
c
d
c
.
.
.
z
.
.
.
aaba...z\ bbcb...z\ ccdc...z\ ...
aaba...z bbcb...z ccdc...z ...是最优构造,具体以
k
k
k构造。
E. Colorings and Dominoes
题意:
给定
n
∗
m
(
1
⩽
n
,
m
,
n
∗
m
⩽
3
⋅
1
0
5
)
n * m \left(1\leqslant n, m, n * m\leqslant 3\cdot10^5\right)
n∗m(1⩽n,m,n∗m⩽3⋅105)的矩阵,
o
o
o表示待填充区域。区域可以被填入红色或蓝色。一张多米诺牌可以覆盖相邻的两个区域。其中水平多米诺牌只能覆盖红色,竖直多米诺牌只能覆盖蓝色。每个区域只能属于一张多米诺牌。求所有填充方案下,每种方案的最多多米诺牌覆盖数量的和。
题解:
已知,一个特定待填充区域的填色使得该区域只能被水平或竖直覆盖。那么,可以考虑连续(横向或纵向)区域在所有情况下的多米诺牌覆盖数量和。很显然,不连续区域不影响该连续区域的覆盖,记连续区域数量为
l
e
n
len
len,总的待填充区域数量为
n
u
m
num
num,那么该连续区域对
a
n
s
ans
ans的贡献为
d
p
[
l
e
n
]
∗
2
n
u
m
−
l
e
n
dp[len] * 2^{num - len}
dp[len]∗2num−len。这里dp也是显然的。
d
p
[
l
e
n
]
dp[len]
dp[len]表示待填充区域长度为
l
e
n
len
len的所有方案的最多多米诺牌覆盖数量和。
记
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]表示连续长度为
i
i
i且最后一张是0(即方向和颜色不匹配)的情况,
d
p
[
i
]
[
1
]
dp[i][1]
dp[i][1]表示连续长度为
i
i
i且最后一张是1(即方向和颜色匹配,且最后一张未使用)的情况,
d
p
[
i
]
[
2
]
dp[i][2]
dp[i][2]表示连续长度为
i
i
i且最后一张是1(即方向和颜色匹配,但最后一张已使用)的情况。
那么有
d
p
[
i
]
[
0
]
=
d
p
[
i
−
1
]
[
0
]
+
d
p
[
i
−
1
]
[
1
]
+
d
p
[
i
−
1
]
[
2
]
dp[i][0] = dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2]
dp[i][0]=dp[i−1][0]+dp[i−1][1]+dp[i−1][2]
d
p
[
i
]
[
1
]
=
d
p
[
i
−
1
]
[
0
]
+
d
p
[
i
−
1
]
[
2
]
dp[i][1] = dp[i - 1][0] + dp[i - 1][2]
dp[i][1]=dp[i−1][0]+dp[i−1][2]
d
p
[
i
]
[
2
]
=
d
p
[
i
−
1
]
[
1
]
+
(
[
1
,
i
−
2
]
末
尾
为
0
,
2
的
方
案
数
)
dp[i][2] = dp[i - 1][1] + ([1, i - 2]末尾为0, 2的方案数)
dp[i][2]=dp[i−1][1]+([1,i−2]末尾为0,2的方案数)
则,
d
p
[
i
]
=
d
p
[
i
]
[
0
]
+
d
p
[
i
]
[
1
]
+
d
p
[
i
]
[
2
]
dp[i] = dp[i][0] + dp[i][1] + dp[i][2]
dp[i]=dp[i][0]+dp[i][1]+dp[i][2]
进一步解释如下,最后一张是0的情况可以由次张0,1,2导出(都填0);最后一张是1的情况可以由次张0,2导出(都填0,不能由1导出是因为会变成2,这个可以由贪心得出最多覆盖数量不允许有两个连续的1);最后一张是2的情况可以由次张1导出(填1)。
下面考虑[1, i - 2]末尾为0, 2的方案数(指填充方案数,而不是数量和)。记
f
[
i
]
[
0
]
f[i][0]
f[i][0]表示连续长度为
i
i
i且最后一张是0(即方向和颜色不匹配)的情况,
f
[
i
]
[
1
]
f[i][1]
f[i][1]表示连续长度为
i
i
i且最后一张是1(即方向和颜色匹配,且最后一张未使用)的情况,
f
[
i
]
[
2
]
f[i][2]
f[i][2]表示连续长度为
i
i
i且最后一张是1(即方向和颜色匹配,但最后一张已使用)的情况。
那么有
f
[
i
]
[
0
]
=
f
[
i
−
1
]
[
0
]
+
f
[
i
−
1
]
[
1
]
+
f
[
i
−
1
]
[
2
]
f[i][0] = f[i - 1][0] + f[i - 1][1] + f[i - 1][2]
f[i][0]=f[i−1][0]+f[i−1][1]+f[i−1][2]
f
[
i
]
[
1
]
=
f
[
i
−
1
]
[
0
]
+
f
[
i
−
1
]
[
2
]
f[i][1] = f[i - 1][0] + f[i - 1][2]
f[i][1]=f[i−1][0]+f[i−1][2]
f
[
i
]
[
2
]
=
f
[
i
−
1
]
[
1
]
f[i][2] = f[i - 1][1]
f[i][2]=f[i−1][1]
时间复杂度为 O ( n m ) O(nm) O(nm)。
update:
E
tutorial中用了概率的方法解决该题,求连续区域的概率值。及
f
[
i
]
f[i]
f[i]表示第
i
i
i位结尾且最后两位被多米诺牌覆盖的概率。(概率是指在所有填充方案中)第
i
−
1
i - 1
i−1位为1的概率为
1
2
\frac{1}{2}
21,而
f
[
i
−
1
]
f[i-1]
f[i−1]表示被覆盖的概率,那么
1
2
−
f
[
i
−
1
]
\frac{1}{2} - f[i - 1]
21−f[i−1]表示
i
−
1
i - 1
i−1为1,但是未被覆盖的概率,那么第
i
i
i位为1时,即最后两位被覆盖。也就是说,
f
[
i
]
=
1
2
(
1
2
−
f
(
i
−
1
)
)
f[i] = \frac{1}{2}(\frac{1}{2} - f(i - 1))
f[i]=21(21−f(i−1))。几个特定的例子如下:
f
[
1
]
=
0
f[1] = 0
f[1]=0
f
[
2
]
=
1
4
f[2] = \frac{1}{4}
f[2]=41
f
[
3
]
=
1
4
−
1
8
f[3] = \frac{1}{4} - \frac{1}{8}
f[3]=41−81
f
[
4
]
=
1
4
−
1
8
+
1
16
f[4] = \frac{1}{4} - \frac{1}{8} + \frac{1}{16}
f[4]=41−81+161
也符合tutorial中的规律。
那么长为
l
e
n
len
len的覆盖和为每一位结尾被覆盖的和,即
2
l
e
n
∑
i
=
1
l
e
n
f
[
i
]
2^{len}\sum_{i = 1}^{len} f[i]
2len∑i=1lenf[i]