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} \]

写个多项式快速幂可过

加油!继续自闭

posted @ 2020-07-21 20:34  deaf  阅读(141)  评论(0编辑  收藏  举报