zoukankan      html  css  js  c++  java
  • 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))

  • 相关阅读:
    ACM-ICPC(10/21)
    ACM-ICPC (10/20)
    ACM-ICPC (10/19)
    ACM-ICPC (10/17)
    ACM-ICPC (10/16) Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)
    ACM-ICPC (10/15) Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)
    ACM-ICPC (10/14)
    战神CPU计算机硬件组装
    ACM-ICPC (10/12)
    ACM-ICPC (10/11)
  • 原文地址:https://www.cnblogs.com/deaf/p/13394202.html
Copyright © 2011-2022 走看看