E.
维护
fi,j 表示从
Si 的开头,从给定串的第
j 个位置往右贪心匹配最长匹配多少,
gi,j 是从
Si 的结尾,从给定串的第
j 个位置往左贪心匹配最长匹配多少。这两个量容易类似倍增维护。
若答案串第一次出现在
Si 里,那么这个子串一定跨过
Si−1 和
Si−2,不然
i 可以更小。枚举这个
i(显然是
log 级别的)利用
f,g 取最小值即可(可能需要额外记录
f,g 尽量匹配以后的位置,这个预处理也是平凡的)。
M.
这类题就是枚举每一位是什么,计算剩下的位置满足情况的排列数即可。
剩下的情况计算,对“坑”和“值”的配对情况设计一个贡献提前计算 dp 即可。如:
dpi,j,k,l 表示前
i 个物品,当前总贡献是
j,还有
k 个没有配对的坑,
l 个没有配对的值得方案数。转移 trivial,最终要求
dp∗,∗,0,0。其中
k,l 可以互相表示,状态数可以降低一维。dp 复杂度
O(n×n2×n)=O(n4)。外层枚举复杂度
O(n2),总复杂度
O(n6)。
K.
我们将设计一种做法证明合法区间数量是
O(nlogn) 并能够直接求出。求出后就简单了,直接 dp 即可。
考虑分治,每次仅考察跨过中点的区间。计算
mid 往前的后缀二进制表达(把每个值视为二进制后后缀和的二进制)的 hash(可以取 sum hash)
l 和
mid+1 往后的前缀二进制表达的 hash
r。
关键观察:对于一个二进制表达,最高位不高于他自己的二进制表达中,和他加起来能凑成合法区间(只有一个位是 1)的表达只有 1 个。且这个数是容易计算的。
那就好了,枚举每个表达,钦定他是高位更高的一个,去另一个区间里找能凑起来的就好了。显然这一轮找出的合法区间数量是
O(len) 的,根据这种分治的结论,
∑len=O(nlogn)。
G.
构造,yk 教我的。
L.
神经题。断环成链,合法即为没有选择的区间相交。
朴素
dp 是
dpl,r 表示只考虑区间
[l,r] 的答案,转移很简单。
考虑随机的意义。它保证了答案不大。同时
dpl,r 关于
l 是有单调性的,所以只需要记录变化的位置即可。可以用 vector 存。
实现其实不困难。
J.
十分高明。
首先给出判定条件:不可行当且仅当有一条边超过了总长度的一半。这个边一定是唯一的,因此可以枚举这条边是什么。记为
i,我们想要计算
P(Xi≥∑j=iXj)。
注意到
Xi∼U(0,2ai),
2ai−Xi 同样服从
U(0,2ai),因此可以说
P(Xi≥∑j=iXj)=P(2ai−Xi≥∑j=iXj)=P(2ai≥∑iXi)。现在问题转化为求
∑iXi≤2k 的概率。
设离散随机变量
Ai,其仅有两种取值 0 和
2i,概率各为 0.5。显然有
Xi=U(0,1)+∑j=0ai−1Aj。
设计
dpi,j 表示已经考虑完前
i 位,此时第
i 位上有
j 个 bit 的概率。转移如下:
dpi,k+⌊2j⌋←dpi,k+⌊2j⌋+2ci1(kci)dpi−1,j
其中
ci=∑j[aj≥i] 表示
Ai 有多少个,并枚举有多少个抽中了
2i。下取整是在考察进位。
于是我们有
P(∑iXi<2k)=dpk,0×2∑i=k+1ci1。即,在
k 位及以前不能出现
k 上的位,同时
k 位以后的所有随机变量都得抽中 0。
初始状态有:
dp0,k+j←dp0,k+j+2c01(kc0)fj
其中
fj 是那堆
U(0,1) 的和
∈[j,j+1) 的概率。这个东西的计算也很有讲究。
设
i.i.d. S1,S2,…Sn∼U(0,1),则
gk=∑i=0k−1fi=P(∑jSj≤k)。求出
gk 易得
fi。
易得在我们的设定下概率等于高维体积,因此我们转向体积的计算。我们放开取值上界。所有数都没有取值上界时,体积为
n!kn,可以归纳证明。
假设至少有
x 个数取值
>1,则将这
x 个数的取值都减去 1 即可转化为原问题。因此恰有
x 个数取值
>1 的体积是
n!(k−x)n,当然需要满足
k−x≥0。
进行二项式反演即可得到
gk=∑i=0k(in)(−1)in!(k−i)n
一个推论:当
k 为实数时,
gk=∑i=0⌊k⌋(in)(−1)in!(k−i)n。