题意:

t组输入,每组数据中n个节点构成一棵树,然后给你n-1条边。给你一个m,然后给你m个k的素数因子,你需要给这n-1条边都赋一个权值,这n-1条边的权值之积应该等于k。如果k的素数因子数量小于n-1,那可以使用1来填充

然后我们定义F(x,y)为节点x到节点y的路径上所有边的和

我们要求出来所有任意两点之间的F(x,y),然后把所有F(x,y)加起来输出,求最大结果是多少,结果取余1e9+7

题解:

因为我们要使

这个尽可能大,所以肯定要按那一条边使用次数最多,我们就把最大那个素数因子给这一条边,这样得到的结果肯定最大

怎么处理每一条边的使用次数,可以使用dfs遍历一遍就可以了

dfs过程中如果遇到叶节点,那么与叶节点相连这条边的使用次数也就是n-1,例如叶节点是1,那么节点1与2,3,4...n这些点构成的路径会经过这条边n-1次

如果不是叶节点,我们首先要在dfs过程中记录一下,这个节点有多少子节点,设为ans,然后ans*(n-ans)就是对与这个节点相连那条边的使用次数

之后再处理一下素数因子,如果素数因子小于n-1,那么就需要补加上n-m+1个1

如果素数因子大于n-1,那么就让多的素数因子乘起来变成一个

dfs的根节点,就随便找一个叶节点就行

代码:

#include<stack>
#include<queue>
#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const double eps=1e-8;
const int INF = 0x3f3f3f3f;
vector<ll>w[maxn],L;
ll p[maxn],n,root,m;
void add_edge(ll x,ll y)
{
w[x].push_back(y);
w[y].push_back(x);
}
ll dfs(ll x,ll fa)
{
ll len=w[x].size(),ans=0;
if(len==1 && x!=root)
{
L.push_back(n-1);
return 1;
}
for(ll i=0; i<len; ++i)
{
ll y=w[x][i];
if(y==fa) continue;
ll temp=dfs(y,x);
ans+=temp;
}
ans++;
//printf("%lld %lld*****\n",x,1);
//printf("%lld***%lld\n",ans,ans*(n-ans));
if(x!=root)
{ L.push_back(ans*(n-ans));
}
return ans;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ll t;
cin>>t;
while(t--)
{
ll m,sum=0;
//num=1;
root=1;
L.clear();
//scanf("%lld",&n);
cin>>n;
for(ll i=1; i<=n; ++i)
w[i].clear();
for(ll i=1; i<n; ++i)
{ ll x,y;
//scanf("%lld%lld",&x,&y);
cin>>x>>y;
add_edge(x,y);
}
//scanf("%lld",&m);
cin>>m;
for(ll i=1; i<=m; ++i)
{
//scanf("%lld",&p[i]);
cin>>p[i];
}
for(ll i=1; i<=n; ++i)
{
if(w[i].size()==1)
{
root=i;
break;
}
}
dfs(root,-1);
sort(p+1,p+1+m,greater<ll>());
sort(L.begin(),L.end(),greater<ll>());
ll d=0;
if (m > n - 1)
{
d = m - n + 1;
for (ll i = 1; i <= d; i++)
{
p[i + 1] = p[i + 1] * p[i] % mod;
}
}
if (m < n - 1)
{
for (ll i = m + 1; i <= n - 1; i++)
{
p[i] = 1;
}
}//printf("*********\n");
sum=0;
for(ll i=1;i<n;++i)
{
//printf("%lld %lld\n",que[i],p[i]);
sum=sum+L[i-1]*p[i+d];
sum = (sum + mod) % mod;
}
cout<<sum<<endl;
}
return 0;
}

Codeforces Round #665 (Div. 2) D - Maximum Distributed Tree dfs贡献记录的更多相关文章

  1. Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree (dfs计数,树)

    题意:给你含有\(n\)个节点,\(n-1\)条边的树,以及\(m\)个质数和\(1\),你需要在这\(m\)个质数和一个\(1\)选择数(质数只能选一次,\(1\)可以多选)给\(n-1\)条边赋值 ...

  2. Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)

    题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1 ...

  3. Codeforces Round #665 (Div. 2)

     Codeforces Round #665 (Div. 2)  A. Distance and Axis 如果\(B\)在\(O\)左边,那么只能是定值\(OA\) 如果\(B\)在\(OA\)中间 ...

  4. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  5. Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造

    B. Invariance of Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/ ...

  6. Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 dp排序

    B. Maximum Submatrix 2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  7. Codeforces Round #276 (Div. 1) B. Maximum Value 筛倍数

    B. Maximum Value Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/484/prob ...

  8. Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)

     E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范 ...

  9. Codeforces Round #172 (Div. 2) D. Maximum Xor Secondary 单调栈应用

    http://codeforces.com/contest/281/problem/D 要求找出一个区间,使得区间内第一大的数和第二大的数异或值最大. 首先维护一个单调递减的栈,对于每个新元素a[i] ...

随机推荐

  1. Server 2012 R2 Standard 安装运行PCS7时出现“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”解决方法

    网上看到了这篇文章https://www.jianshu.com/p/21f4bb8b5502,根据思路自己尝试,解决了丢失的问题.提示[计算机中丢失api-ms-win-crt-runtime-l1 ...

  2. 【JavaWeb】JSON 文件

    JSON 文件 什么是 JSON JSON(JavaScript Object Notation),即 JS 对象符号. 是一种轻量级(相对于 XML 来说)的数据交换格式,易于阅读和编写,同时也易于 ...

  3. .NET 5 程序高级调试-WinDbg

    上周和大家分享了.NET 5开源工作流框架elsa,程序跑起来后,想看一下后台线程的执行情况.抓了个进程Dump后,使用WinDbg调试,加载SOS调试器扩展,结果无法正常使用了: 0:000> ...

  4. windows下使用mingw和msvc静态编译Qt5.15.xx

    windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...

  5. 基于kubernetes实现coredns的及验证

    CoreDNS:  k8s内部的DNS ,用于对pod对service做记录的,好让其他的pod做访问 这里不用做过多的阐述 官方kube-dns现在已经没有在维护了,从Kubernetes 1.11 ...

  6. 两种方式,花五分钟就能构建一个 Spring Boot 应用

    前言 Spring Boot 的好处自然不必多说,对于想要从事 Java 工作的朋友们来说,可谓是必学的技能. 在我看来,它的优势就是多快好省. 功能多,很多常用的能力都有集成: 接入快,简单的几行代 ...

  7. 【转】使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录

    [原]http://blog.chinaunix.net/uid-26284395-id-2949145.html ssh-keygen  产生公钥与私钥对. ssh-copy-id 将本机的公钥复制 ...

  8. jdk安装逻辑学习笔记

    一.三个重要变量 很多软件需要用到jdk,安装的时候主要用到三个变量,那这三个变量的代表逻辑又是什么呢? 1.JAVA_HOME(JDK的安装目录)这个变量值选择的是jdk的安装目录 2.classp ...

  9. Go RPC 框架 KiteX 性能优化实践 原创 基础架构团队 字节跳动技术团队 2021-01-18

    Go RPC 框架 KiteX 性能优化实践 原创 基础架构团队 字节跳动技术团队 2021-01-18

  10. Git:.gitignore和.gitkeep文件的使用 让空文件夹被跟踪

    Git:.gitignore和.gitkeep文件的使用 Git:.gitignore和.gitkeep文件的使用 https://majing.io/posts/10000001781172 .gi ...