LOJ 6495~6497「雅礼集训 2018 Day1」

.
真是看懂std就秒的三道题,但是看懂就很难啊
(感谢superguymj和memset0两个大佬的代码)
稍微说一下题解

--------------------------------------------------------

「雅礼集训 2018 Day1」树

这道题的正解被superguymj大佬吊打了,原来 O ( n ⋅ 2 n ) O(n·2^n) O(n2n)变成了 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=1i[(y=1j2F(ix,j)F(x,y)C(i2,x1)+ ∑ 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=1jF(ix,y)F(x,j1)C(i2,x1)]这个转移式是什么意思呢
就是说,考虑到2号节点非常特殊,他的父亲一定是1,那么可以考虑枚举以2为根的那个子树的高度,以此作为转移的依据,当 H ( 2 ) < j − 1 H(2)<j-1 H(2)<j1则剩下部分必须是高度为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<=aiF(v,1ki) 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<aiF(v,1ki)发现是一个非常熟悉的东西,就是卷积
那么直接用分治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,1j,x,1)+=2iF(i,j,x,y)2.如果x=1,那么就要分别考虑路径数奇偶性变不变的情况,稍加分析即可发现,两者的情况,是一样的,都分别有 2 i − 1 2^{i-1} 2i1种方法,也就是说,只要有符合条件的点,那么转移的系数和,是固定的,和点数无关
于是就得到 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,1j,x,1)+=2i1F(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)+=2i1F(i,j,x,y)剩下的过程就很简单了,预处理2的幂就行了
代码

你可能感兴趣的:(OI,图论,--------连通性,求解策略,----动态规划,--------期望dp,--------序列形dp,数学,----组合数学,----概率/期望,----多项式相关)