ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree

2020-08-22 17:31:18  阅读:244  来源: 互联网

标签:10 int Tree 665 Distributed leq maxn siz 边权


Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree

题意

给定一棵\(n\) 个结点的树,对这棵树分配边权,使得这棵树的边权的乘积为\(k\) ,且要求所有两点的简单路径边权之和最大。

\(k\) 以质因子的形式给出,有\(m\) 个质因子

结果取余1e9+7

\[n \leq 10^5 ,m \leq 6\cdot 10^4 ,p_i \leq 6\cdot 10^4 \]

分析

显然我们需要考虑每条边的贡献,如何求得一条边的贡献次数?简单排列组合一下就知道,令\(siz(i)\) 为\(i\) 号结点的子树大小,那么\(i\) 和父亲结点的连边的贡献次数就是$ size(i) \cdot (n - siz(i))$ ,这样我们只要贪心地把最大的质因子分配给贡献最大的连边即可,至于为什么是质因子,可以通过不等式证明。

这里还需要简单讨论一下 $ m \leq n - 1$ 的情况。

代码

ll siz[maxn], p[maxn], q[maxn];
vector<int> e[maxn];

void dfs(int u, int fa) {
    siz[u] = 1;
    for (auto it : e[u]) {
        if (it == fa) continue;
        dfs(it, u);
        siz[u] += siz[it];
    }
}

int main() {
    int T = readint();
    while (T--) {
        int n = readint();
        for (int i = 1; i <= n; i++) e[i].clear(), siz[i] = 0, p[i] = 1;
        for (int i = 1; i < n; i++) {
            int x, y;
            scanf("%d%d", &x, &y);
            e[x].push_back(y);
            e[y].push_back(x);
        }
        dfs(1, 0);
        int m = readint();
        for (int i = 1; i <= m; i++) p[i] = readll();
        if (m < n - 1) m = n - 1;
        sort(p + 1, p + m + 1);
        for (int i = n; i <= m; i++) {
            p[n - 1] *= p[i];
            p[n - 1] %= MOD;
        }
        ll res = 0;
        for (int i = 1; i < n; i++)
            q[i] = (n - siz[i + 1]) * siz[i + 1];
        sort(q + 1, q + n);
        for (int i = 1; i < n; i++)
            res = (res + (p[i] % MOD * q[i] % MOD) % MOD) % MOD;
        Put(res);
        puts("");
    }
}

标签:10,int,Tree,665,Distributed,leq,maxn,siz,边权
来源: https://www.cnblogs.com/hznumqf/p/13546407.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有