Day1
T1:
给出一个排列
P
P
P,令
f
(
P
)
f(P)
f(P) 表示所有字典序比
P
P
P 小的排列串成的串,问
f
(
P
)
f(P)
f(P) 本质不同的子串个数,
n
≤
50
n \le 50
n≤50
T2:
给出
n
n
n 个集合,一开始每个集合只有一个数,每次随机合并两个集合,直到只剩下
k
k
k 个
最后的答案
f
(
k
)
f(k)
f(k) 是对这
k
k
k 个集合的贡献求和,每个集合的贡献是
(
m
a
x
(
S
)
−
m
i
n
(
S
)
)
2
(max(S)-min(S))^2
(max(S)−min(S))2,求
f
(
l
…
r
)
f(l…r)
f(l…r) 的期望
简要题解:
考虑钦定选一个集合 S,那么它的贡献就是
(
m
a
x
(
S
)
−
m
i
n
(
S
)
)
2
(max(S)-min(S))^2
(max(S)−min(S))2,乘上存在集合
S
S
S 的概率
显然只与集合的大小有关,于是需要求出
g
(
i
,
k
)
g(i,k)
g(i,k) 表示 ,最后剩下
k
k
k 个存在
∣
S
∣
=
i
|S|=i
∣S∣=i 的概率
另外令
f
(
i
)
f(i)
f(i) 表示所有大小为
i
i
i 的集合的贡献和
先考虑
f
(
i
)
f(i)
f(i),考虑钦定一个最大值和一个最小值
f
(
i
)
=
∑
l
=
1
n
∑
r
=
l
n
(
a
r
−
a
l
)
2
∗
(
r
−
l
−
1
i
−
2
)
f(i)=\sum_{l=1}^n\sum_{r=l}^n(a_r-a_l)^2*\binom{r-l-1}{i-2}
f(i)=l=1∑nr=l∑n(ar−al)2∗(i−2r−l−1)
后面只与
r
−
l
−
1
r-l-1
r−l−1 有关,于是转换为求出所有
r
−
l
−
1
r-l-1
r−l−1 为某一个定值的所有
l
,
r
l,r
l,r 的贡献
拆开就可以卷积实现
考虑求
g
(
i
,
k
)
g(i,k)
g(i,k),令
D
(
n
)
D(n)
D(n) 表示把
n
n
n 个合并成一个的方案数,那么显然
D
(
n
)
=
∏
i
=
2
n
(
i
2
)
D(n)=\prod_{i=2}^n\binom{i}{2}
D(n)=i=2∏n(2i)
那么将
n
n
n 个合并成
k
k
k 个的方案数就是
D
(
n
)
/
D
(
k
)
D(n)/D(k)
D(n)/D(k)
于是有
g
(
i
,
k
)
=
D
(
k
)
D
(
n
)
∗
(
n
−
k
i
−
1
)
∗
D
(
i
)
∗
D
(
n
−
i
)
D
(
k
−
1
)
g(i,k)=\frac{D(k)}{D(n)}*\binom{n-k}{i-1}*D(i)*\frac{D(n-i)}{D(k-1)}
g(i,k)=D(n)D(k)∗(i−1n−k)∗D(i)∗D(k−1)D(n−i)
意义是把
i
i
i 个集合合并成一个,再把
n
−
i
n-i
n−i 个集合合并成
k
−
1
k-1
k−1 个,有序拼接,再除一个总方案数
A
n
s
(
k
)
=
∑
i
=
1
n
f
(
i
)
∗
g
(
i
,
k
)
Ans(k)=\sum_{i=1}^nf(i)*g(i,k)
Ans(k)=i=1∑nf(i)∗g(i,k)
展开用
N
T
T
NTT
NTT 优化即可
细节记不太清,希望大家指出错误
大概就是钦定集合,转成集合大小,枚举最大最小组合数算方案,然后算出概率,用卷积优化
T3:给一个矩阵,有
p
≤
1
e
5
p\le 1e5
p≤1e5 个操作来初始化,给定
s
,
l
,
r
,
x
s,l,r,x
s,l,r,x 将所有与
s
s
s 互质的行的
[
l
,
r
]
[l,r]
[l,r] 加上
x
x
x
有
q
≤
5
e
4
q\le 5e4
q≤5e4 个询问,
s
,
l
,
r
s,l,r
s,l,r 表示询问所有与
s
s
s 互质的行的
[
l
,
r
]
[l,r]
[l,r] 的和
n
,
m
≤
5
e
4
n,m\le 5e4
n,m≤5e4
Day2
T1:你有
n
n
n 条鱼,每条为毒鱼或小鱼,敌方有圣盾鱼和大鱼
任意鱼和圣盾鱼对战后都会将圣盾鱼变成大鱼,只有毒鱼和大鱼对战能杀死大鱼,小鱼对战大鱼无影响
q
q
q 次询问
(
k
,
x
)
(k,x)
(k,x) 表示,在对方开始时已经有
x
x
x 条大鱼的情况下,你用
1
−
k
1−k
1−k 的鱼依次与对方对战,假设有
y
y
y 条圣盾鱼,最大化
y
y
y 使得能全部打完
n
,
q
≤
4
e
5
n,q≤4e5
n,q≤4e5
好像方法很多,线性可以随便做,但还是说一下我的奇葩方法
如果当前是小鱼,那么破盾,如果是毒鱼,那么就杀死大鱼将 ans++
如果没有大鱼,那么毒鱼用来破盾
考虑离线下来做一个前缀,维护每一个
x
x
x 的答案
动态维护剩下多少大鱼,相当于动态维护一个数组,如果是毒鱼就是将为 0 的地方变成 1,将不为 0 的地方减 1 并将答案加 1,否则全部加 1
维护每一个权值的集合,发现只有合并,带权并查集维护
T2:给定 { a 0 , a 1 , . . . , a n } , { p 0 , p 1 , . . . , p n } \{a_0,a_1,...,a_n\},\{p_0,p_1,...,p_n\} {a0,a1,...,an},{p0,p1,...,pn},p 表示分式的横线长度也就是分式运算的优先级,问 p l . . . p r p_l...p_r pl...pr 组成的分式的值, n , q ≤ 5 e 5 n,q\le 5e5 n,q≤5e5
考场打的单调栈,但是有 35 没写怪可惜的
考虑一个数的贡献是本身还是逆元,发现跟单调栈的奇偶性有关,于是可以离线下来,维护每一个
l
l
l 的答案,考虑
r
r
r 的贡献就可以做,就是将据
r
r
r 有奇数段的全部乘逆元,有偶数段的乘本身
这样复杂度是O(段数),只能过随机数据,但类似刚刚的带权并查集对奇数段和偶数段分别维护就可以了
还有一种方法就是建出一个类似线段树的东西查询,同样随便过随机数据,考虑求出一个结点以
m
i
d
mid
mid为分界点的前缀和后缀的答案,这样一个区间只会在第一个被切开的地方求出答案
考虑一个后缀吧,是由右儿子的后缀和右儿子的全部以及左儿子的后缀组成,后面这个玩意就是将左儿子的后缀全部除一个数,线段树合并即可
还可以对建出的树用广义线段树处理,以后再学(FLAG)
T3:有一个大环顺次连接 ( i , i + 1 ) (i,i+1) (i,i+1) 边权为 1 e 9 1e9 1e9,令给出 m ≤ 1 e 5 m\le 1e5 m≤1e5 条边,边权为 w i ≤ 1 e 4 w_i\le 1e4 wi≤1e4,求任意两个点的最小割之和, n ≤ 7 e 3 n\le 7e3 n≤7e3
显然只会段两条边,枚举两条边,那么最小割就是两条边的权值加上穿过中间的权值,预处理二维前缀和就可以
O
(
1
)
O(1)
O(1) 得到,考虑哪些点对可以以这个最小割为答案,同样是一个矩阵
于是就是矩阵覆盖单点
m
i
n
min
min 可以
O
(
n
2
l
o
g
(
n
)
2
)
O(n^2log(n)^2)
O(n2log(n)2)
正解好像是用最小割树,只求
O
(
n
)
O(n)
O(n) 次最小割,只要每次做到
O
(
n
)
O(n)
O(n) 就可以了,但还不是很会(FLAG)
竞赛算法解析
本文解析了多项竞赛算法题目,包括字典序子串计数、集合贡献期望、矩阵操作与查询、鱼与大鱼战斗策略、分式计算、最小割求和等问题,提供了详细的算法思路与优化方法。
749





