.
真是看懂std就秒的三道题,但是看懂就很难啊
(感谢superguymj和memset0两个大佬的代码)
稍微说一下题解
--------------------------------------------------------
「雅礼集训 2018 Day1」树
这道题的正解被superguymj大佬吊打了,原来
O
(
n
⋅
2
n
)
O(n·2^n)
O(n⋅2n)变成了
O
(
n
4
)
O(n^4)
O(n4)
取整?直接打表就行了不管了
对于取模的答案,首先考虑dp,我们记
F
(
i
,
j
)
F(i,j)
F(i,j)表示i个节点高度为j的方案数,期望最后除个
n
!
n!
n!就行了
怎么转移?发现没法转移?麦老大给出了一个非常通俗的方法
F
(
i
,
j
)
=
∑
x
=
1
i
[
(
∑
y
=
1
j
−
2
F
(
i
−
x
,
j
)
∗
F
(
x
,
y
)
∗
C
(
i
−
2
,
x
−
1
)
+
F(i,j)=\sum_{x=1}^i\big[(\sum_{y=1}^{j-2}F(i-x,j)*F(x,y)*C(i-2,x-1)+
F(i,j)=x=1∑i[(y=1∑j−2F(i−x,j)∗F(x,y)∗C(i−2,x−1)+
∑
y
=
1
j
F
(
i
−
x
,
y
)
∗
F
(
x
,
j
−
1
)
∗
C
(
i
−
2
,
x
−
1
)
]
\sum_{y=1}^jF(i-x,y)*F(x,j-1)*C(i-2,x-1)\big]
y=1∑jF(i−x,y)∗F(x,j−1)∗C(i−2,x−1)]这个转移式是什么意思呢
就是说,考虑到2号节点非常特殊,他的父亲一定是1,那么可以考虑枚举以2为根的那个子树的高度,以此作为转移的依据,当
H
(
2
)
<
j
−
1
H(2)<j-1
H(2)<j−1则剩下部分必须是高度为j,否则可以是任意,最后乘上标号即可
代码 (以后LOJ的代码直接放链接了节省版面)
--------------------------------------------------------
「雅礼集训 2018 Day1」仙人掌
这个题告诉我们圆方树其实不难写
我们先考虑树的情况,记
F
(
i
,
j
)
F(i,j)
F(i,j)表示当节点往i父亲的出度为j的时候的方案数
那么可以得到转移
F
(
i
,
0
)
=
∏
k
1
+
k
2
+
⋯
+
k
c
<
=
a
i
F
(
v
,
1
−
k
i
)
F(i,0)=\prod_{k_1+k_2+\dots+k_c<=a_i}F(v,1-k_i)
F(i,0)=k1+k2+⋯+kc<=ai∏F(v,1−ki)
F
(
i
,
1
)
=
∏
k
1
+
k
2
+
⋯
+
k
c
<
a
i
F
(
v
,
1
−
k
i
)
F(i,1)=\prod_{k_1+k_2+\dots+k_c<a_i}F(v,1-k_i)
F(i,1)=k1+k2+⋯+kc<ai∏F(v,1−ki)发现是一个非常熟悉的东西,就是卷积
那么直接用分治FFT乘起来就行了
那么加上了环,怎么办
先建一个圆方树(当然不建也可以,反正只需要单独处理环就可以了)
处理环的时候,我们先不管环的根(就是dfs树这个环的第一个节点)
让后按照一个顺序遍历整个环,枚举环根到第一个点的那条边的方向
记
G
(
i
,
j
)
G(i,j)
G(i,j)表示做到环上第i个节点,这个节点是否有出边的方案数
那么枚举下一个点出度的个数,也就是
F
(
x
,
j
)
F(x,j)
F(x,j)的j,转移就很简单了,可以直接看代码
最后记得加上第一条边,就得到了这个方点的方案
反正不太懂就看代码,很容易看懂
代码
--------------------------------------------------------
「雅礼集训 2018 Day1」图
此题妙哉
直接上正解吧,考虑dp
记
g
(
i
)
g(i)
g(i)表示以i结尾的点的路径的数量
记
F
(
i
,
x
,
y
)
F(i,x,y)
F(i,x,y)表示做到第i个点,有x个黑色的且
g
(
)
g()
g()为奇数的点,y类似
考虑转移,枚举第i+1个点的颜色,我们发现会改变路径数量奇偶性的因素只和这x个黑点
和y个白点有关系,所以直接枚举要连多少条这样的边就行了,剩下的就直接
2
n
2^n
2n
好的这样就有50分了,考虑优化
由于满分范围要求不高于
O
(
n
log
n
O(n\log n
O(nlogn)的做法,我们考虑简化状态
容易发现,最后答案只和
x
+
y
x+y
x+y的奇偶性有关,可以考虑从这里入手
记
F
(
i
,
j
,
x
,
y
)
F(i,j,x,y)
F(i,j,x,y)表示做到第i个点,满足条件的路径的奇偶性j,x和y表示有没有g()为奇数的黑点和白点
那么转移就会变得简单,只考虑下一个点是白色的情况,那么
1.如果x=0,那么加入这个白色点无论怎么连边,路径数一定会+一个奇数,乘上可以选择的i条边,得到转移
F
(
i
+
1
,
1
−
j
,
x
,
1
)
+
=
2
i
∗
F
(
i
,
j
,
x
,
y
)
F(i+1,1-j,x,1)+=2^i*F(i,j,x,y)
F(i+1,1−j,x,1)+=2i∗F(i,j,x,y)2.如果x=1,那么就要分别考虑路径数奇偶性变不变的情况,稍加分析即可发现,两者的情况,是一样的,都分别有
2
i
−
1
2^{i-1}
2i−1种方法,也就是说,只要有符合条件的点,那么转移的系数和,是固定的,和点数无关
于是就得到
F
(
i
+
1
,
1
−
j
,
x
,
1
)
+
=
2
i
−
1
∗
F
(
i
,
j
,
x
,
y
)
F(i+1,1-j,x,1)+=2^{i-1}*F(i,j,x,y)
F(i+1,1−j,x,1)+=2i−1∗F(i,j,x,y)和
F
(
i
+
1
,
j
,
x
,
y
)
+
=
2
i
−
1
∗
F
(
i
,
j
,
x
,
y
)
F(i+1,j,x,y)+=2^{i-1}*F(i,j,x,y)
F(i+1,j,x,y)+=2i−1∗F(i,j,x,y)剩下的过程就很简单了,预处理2的幂就行了
代码
LOJ 6495~6497「雅礼集训 2018 Day1」
最新推荐文章于 2020-11-27 17:36:52 发布
博客详细解析了雅礼集训2018第一天的三道题目,涉及动态规划、树状数组、圆方树和扩展的灰等相关算法。通过讲解和代码示例展示了如何将复杂问题转化为O(n^4)、O(n log n)的解决方案,适合进阶学习者参考。

234

被折叠的 条评论
为什么被折叠?



