20200721训练记录

打了 Comet OJ - Contest #6的 D E F 三道题

A感觉跟原来的一个题有点类似就是每种深度分开讨论,但是根节点感觉需要特殊讨论就先放了

B拿到题先用SA写了个(O(n^2))暴力,然后发现是一个后缀和起始位置在它后面一堆后缀的lcp作贡献,于是考虑单调栈,发现只能后面对前面作贡献,就CDQ分治一下,时间是(O(nlogn))

结果实现起来要维护五个东西细节巨多,写了2h写出来跑得跟(O(nlog^2n))的后缀树上树剖一样快

C神仙题,ztc巨佬在oeis上找到了数列,但是网站上并没有通项公式

结果最后就过了B,zbl

A最后发现其实只需要维护答案>=i的就可以了

然后深度<=i的就只能取一个

然后深度>i的就每层单独讨论。

按dfn序把这些点排个序

(f(i,j))为dfn排i的和排j的点相遇的时间

那么(f(i,j)=max_{k=i+1}^{j} f(k-1,k))

于是按大小排个序并查集维护一下相遇时间<i的连续段就好了

那么每个连续段最多选一个数乘起来可以得到答案

C是数析合树,自闭

丢个大佬的学习笔记link

其实就是数根节点是析点,根的所有儿子都是叶节点的析合树的个数

考虑他的生成函数是(F(x))

考虑i个数的排列的生成函数

[H(x)=sum_{i>=1}i!*x^i ]

那么根据析合树的性质,析点的儿子可以是任意析点合点或叶子

所以所有根节点是析点的析合树个数的生成函数(P(x))就满足

[P(x)=F(H(x)) ]

大概就是每个叶子换成一棵子析合树

我们考虑求根节点是合点的析合树个数

把子树大小顺序从小到大和从大到小分开讨论

显然这两个是相同的

不妨设从小到大的生成函数是(G(x))

那么就有

[P(x)=H(x)-2*G(x)-x ]

这个(x)是扣掉单个点的析合树

考虑计算(G(x))

如果一个析点为根

那么他的子树中不能存在和他相同顺序的析点

所以

[G(x)=sum_{i>=2}(H(x)-G(x))^i ]

解之得到

[G(x)=frac{H(x)^2}{1+H(x)} ]

写个多项式求逆就好了

那么我们知道了(H(x))(P(x))(F(H(x))=P(x))怎么算([x^n]F(x))

考虑扩展拉格朗日反演

丢个大佬的总结link

反正最后就是

[[x^n]F(x)=frac{1}{n}[x^{n-1}]frac{P'(x)}{(frac{H(x)}{x})^n} ]

写个多项式快速幂可过

加油!继续自闭

原文地址:https://www.cnblogs.com/deaf/p/13357247.html