20200724训练记录

三道神仙题我直接爆零

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

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

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

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

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

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

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

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

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

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

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

[f(x)=sum_{i>=1} inom{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 logsum))

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

再算上重链上的边

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

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

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

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

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