1 条题解

  • 0
    @ 2026-10-2 16:59:05

    狼人

    在树形dp中处理到结点xx时,令dp[i][j]dp[i][j]表示所有以结点xx为公共祖先的连通分支中,使得ii种族狼人个数减其他种族总个数为jj的个数。另外注意到每个ii是为众数的方案实际上是相互独立的,dp[i][j]dp[i][j]可仅用于检查ii为众数的情况,故jj对ii的取值范围为−cnt[i]∼cnt[i]-cnt[i]\sim cnt[i],更小jj的不能构成ii成为众数的局部方案,更大的则不可能出现。故对所有ii状态总数实为O(n2)O(n^2)。

    考虑递推,更新时初值先考虑子树根xx必选。对xx的每个子结点为yy,有dpx[i][j]+=dpx∗[i][j−k]⋅dpy[i][k]dp_x[i][j] += dp_x^*[i][j-k]\cdot dp_y[i][k],其中dpx∗dp_x^*为考虑该子树前的结果。

    考虑复杂度,自下而上归纳证明复杂度为O(n2)O(n^2)。若nn规模子树的根结点为xx,不妨认为其kk个子结点,各自子树的结点数为S1,S2,⋯ ,SkS_1,S_2,\cdots,S_k。则根据归纳假设,子树已经进行的操作消耗不超过S12,S22,⋯ ,Sk2S_1^2,S_2^2,\cdots,S_k^2,不妨认为S1S_1最大,则可以放缩为S1∑Si=S1nS_1\sum S_i = S_1 n。然后考虑本轮子树的合并,认为初值为S1S_1对应子树的结果(因为和根结合只相当于其移一位),对jj按cnt[i]cnt[i]放缩,对kk按sz[y]sz[y]放缩,则求和为$\sum _{子结点y}\sum _{颜色i}(cnt[i]\times sz[y])=(n-S_1)n$,两个求和本都是结点个数,但S1S_1对应子树不用更新。结合子树复杂度,复杂度放缩为(n−S1)n+S1n=n2(n-S_1)n+S_1n = n^2。

    考虑答案,注意“连通分支的公共祖先”已经构成所有连通分支的分类,故只需对每一个xx处的dpdp统计答案,枚举ii累加j>0j>0的dp[i][j]dp[i][j]即可。时间、空间复杂度O(n2)O(n^2)。

    • 1

    信息

    ID
    2335
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    (无)
    递交数
    14
    已通过
    1
    上传者