Codeforces Round #665 (Div. 2) D - Maximum Distributed Tree dfs贡献记录
题意:
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贡献记录的更多相关文章
- Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree (dfs计数,树)
题意:给你含有\(n\)个节点,\(n-1\)条边的树,以及\(m\)个质数和\(1\),你需要在这\(m\)个质数和一个\(1\)选择数(质数只能选一次,\(1\)可以多选)给\(n-1\)条边赋值 ...
- Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)
题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1 ...
- Codeforces Round #665 (Div. 2)
Codeforces Round #665 (Div. 2) A. Distance and Axis 如果\(B\)在\(O\)左边,那么只能是定值\(OA\) 如果\(B\)在\(OA\)中间 ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- 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/ ...
- 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 ...
- 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 ...
- Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)
E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范 ...
- Codeforces Round #172 (Div. 2) D. Maximum Xor Secondary 单调栈应用
http://codeforces.com/contest/281/problem/D 要求找出一个区间,使得区间内第一大的数和第二大的数异或值最大. 首先维护一个单调递减的栈,对于每个新元素a[i] ...
随机推荐
- dubbo配置启动时检查
启动检查设置 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用会抛出异常,阻止Spring初始化完成,默认check="true":是开启检查. 比如测试的时候,有些服务并不 ...
- Java 使用 commons-fileupload 实现文件上传工具类
依赖包 文件上传可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io commons-io.jar: https://repo1.maven. ...
- 关于JDK15的简单理解
一.为什么要了解JDK15? 2020年9月15日,Oracle官方发布了JDK15版本,及时关注官方的更新动态,可以让我们在日常开发中更合理的选择更加优秀的工具方法,避免使用一些过时的或一些即将被删 ...
- 一文读懂k8s之Pod安全策略
导读 Pod容器想要获取集群的资源信息,需要配置角色和ServiceAccount进行授权.为了更精细地控制Pod对资源的使用方式,Kubernetes从1.4版本开始引入了PodSecurityPo ...
- [Usaco2010 Hol]cowpol 奶牛政坛
题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...
- 1.5V转3V电源芯片,1.5V转3V稳压芯片
1.5V干电池的供电电压一般是0.9V-1.6V左右,因为供电电压不稳,所以需要1.5V转3V的稳压电源芯片,当0.9V-1.6V输入电压时,输出电压能稳定3V输出,给模块供电,MCU供电,LED灯供 ...
- JavaScript小记
JavaScript小记 1. 简介 1. 语言描述 JavaScript 是一门跨平台.面向对象的弱类型动态脚本编程语言 JavaScript 是一门基于原型.函数先行的语言 JavaScript ...
- 从零搭建一个IdentityServer——集成Asp.net core Identity
前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...
- Netty之Unpooled_Bytebuf
前言 计算机存储基本单位是字节(byte),传输基本单位是bit(位),JAVA NIO提供了ByteBuffer等七种容器来提升传输时的效率,但是在使用时比较复杂,经常要进行读写切换,主要缺点如下: ...
- python_3 装饰器之初次见面
装饰器 定义:本质是函数,(只不过是用来装饰其他函数而已),就是为其他函数添加附加功能 原则: 1. 不能修改被修饰函数的源代码 2.不能修改被修饰函数的调用方式 实现装饰器的知识储备 1.函数即&q ...