打了 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个数的排列的生成函数
那么根据析合树的性质,析点的儿子可以是任意析点合点或叶子
所以所有根节点是析点的析合树个数的生成函数(P(x))就满足
大概就是每个叶子换成一棵子析合树
我们考虑求根节点是合点的析合树个数
把子树大小顺序从小到大和从大到小分开讨论
显然这两个是相同的
不妨设从小到大的生成函数是(G(x))
那么就有
这个(x)是扣掉单个点的析合树
考虑计算(G(x))
如果一个析点为根
那么他的子树中不能存在和他相同顺序的析点
所以
解之得到
写个多项式求逆就好了
那么我们知道了(H(x)),(P(x))和(F(H(x))=P(x))怎么算([x^n]F(x))呢
考虑扩展拉格朗日反演
丢个大佬的总结link
反正最后就是
写个多项式快速幂可过
加油!继续自闭