• 【题解】雅礼集训 2018 Day1 题解


    计数专场?

    「雅礼集训 2018 Day1」树

    考虑令 (f_{i,j}) 表示大小为 (i) 的树,深度为 (j) 的方案数。

    一般的 DP 合并过程:枚举大小为 (a,b) 的树,然后把 (b) 的根接到 (a) 的根下面。但是这样会算重:打个比方,以 (1) 为根,儿子为 (2,3) 的树会被算两次。

    不过可以发现,原树的任意一颗子树中,编号最小的点一定为根,编号次小的一定与根相连。这样只需要接入 (b) 的时候钦定 (b) 的根是编号次小的点即可。

    不取模的答案本地用 __int128_t 或者 double 打表即可。

    已经实现:提交记录


    「雅礼集训 2018 Day1」仙人掌

    考虑一个简单的 DP:令 (f_{i,0/1}) 表示点 (i) 是否被父亲的边指向时的子树方案数。这个 DP 可以用分治 NTT 优化。

    现在考虑环上的情况,令 (g_{i,0/1,0/1}) 表示环上第 (i) 个点,上一个点到其是入边 / 出边,其到下一个点是入边 / 出边时前 (i) 个点的方案数。只需要对子树的 (f) 做了前缀和就可以快速转移。

    最后合并给环中最上面的点即可,用分治 NTT 加速。

    已经实现:提交记录

    被新码风整吐了。


    「雅礼集训 2018 Day1」图

    以路径长度为奇数为例。

    考虑前 (i) 个点中,有 (w_0) 个奇数白点,(w_1) 偶数白点,(b_0) 个奇数黑点,(b_1) 个偶数黑点:

    • 如果当前点为白点:

      • 路径为奇数:

        [2^{w_0+w_1}sum_{i=0}^{b_0}[2mid i]sum_{j=0}^{b_1}{b_0choose i}{b_1choose j}=2^{w_0+w_1+b_0+b_1-1} ]

      • 路径为偶数:情况类似。

    • 如果当前点为黑点:情况类似。

    这样子的话可以发现,奇数路径和偶数路径的数量是相等的,正因为如此,就没必要将奇数和偶数分别记录了。接着考虑黑白点个数。容易发现上述转移式跟黑白点个数并没有关系。

    最后需要注意,奇偶路径数相等,即组合数下标按照奇偶分类后和相等,对 ({nchoose m})(n=0) 的情况是不成立的,在这种情况下只能从偶数转移到奇数,需要单独讨论。

    判断 (n=0) 的情况只需要记录是否存在相应节点即可,注意路径数奇偶性还需要再开一维。时间复杂度 (O(n))

    已经实现:提交记录

  • 相关阅读:
    第四次作业
    团队编程第三次博客
    团队编程2
    团队编程
    ARM寄存器总结:
    proc介绍及问题分析
    Ubuntu连接手机步骤
    Bluetooth(android 4.2.2版本)
    Android Bluetooth 总结
    android代码常识
  • 原文地址:https://www.cnblogs.com/losermoonlights/p/14465727.html
Copyright © 2020-2023  润新知