20200724训练记录

三道神仙题我直接爆零

A题发现选择左括号还是右括号都是一次会把一个连续段全部选完

发现可以变成这样的pair(a,b)表示先\(-a\)\(+b\)

感觉可以像【集训队作业2018】三角形一样贪心,但是有强制的先后顺序就很zb

看题解发现可以把两个序列合并一下

就是两个pair如果后面比前面劣那么选了前面马上就会选后面那个

于是就把两个pair合并在一起

这样以后两个序列就是从优到劣了

像归并排序一样并起来搞就行了

B题数序列没啥思路只是知道要二项式反演一下

题解说其实至少\(i\)\(<\)其实等价于有\(n-i\)个内部全是小于的连续段

这个连续段的生成函数很好求,就是

\[f(x)=\sum_{i>=1} \binom{m}{i}*x^i=((x+1)^{m}-1) \]

于是对于至少\(i\)个而言答案可以表示成

\[\sum_{n}[x^n]f(x)^{n-i} \]

这还是不好算

于是题解神仙转化把它变成等比数列

\[\sum_{n}[x^N]f(x)^{n-i}*x^{N-n} \]

也就是

\[[x^N]\frac{f^{N+1-i}-x^{N+1-i}}{f-x} \]

这里需要用一次多项式求逆

这样就可以继续推了

亿一会式子发现只需要一次卷积就可以搞定了

C题树上选不相交的x条边

考虑dp

设f[i][j][0/1]表示i的子树中选了j条,与i相连的边是否被选中过

直接dp是\(O(n^3)\)

考虑这个dp数组是上凸的于是就可以用闵可夫斯基和实现两个dp数组\(O(长度和)\)的合并

但暴力dp还是\(O(n^2)\)

考虑类似动态dp的做法优化

每个点先只和自己的所有轻儿子合并

这里合并用分治合并是\(O(\sum log\sum)\)

在重链顶端合并这条重链上所有点及其轻儿子的信息

再算上重链上的边

同样是分治合并\(O(\sum log \sum)\)

注意到一个点到根只有\(O(logn)\)条重链

所以一个点贡献的合并量是\(O(logn)\)级别的

总复杂度是\(O(nlog^2n)\)

posted @ 2020-07-28 22:12  deaf  阅读(95)  评论(0编辑  收藏  举报