Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)
题目链接
题目大意
给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义
f(u,v)为u到v的边权和求 \(\max \sum_{i=1}^{i=n}\sum_{j=1}^{j=n} f(i,j)\)
k为m个质因子的乘积
题目思路
这显然是一个求贡献的裸题,但是里面有易错点
1:sort前不要先取模
2:还有要区分m可能比n-1大(太坑了
代码
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-10;
int n, m, a[maxn];
ll sz[maxn], p[maxn];
int head[maxn],cnt;
struct node{
    int to, next;
}e[maxn<<1];
void add(int u,int v){
    e[++cnt] = {v, head[u]};
    head[u] = cnt;
}
void dfs(int son,int fa){
    sz[son] = 1;
    for (int i = head[son]; i;i=e[i].next){
        if(e[i].to==fa) continue;
        dfs(e[i].to,son);
        sz[son] += sz[e[i].to];
    }
}
void init(){
    cnt = 0;
    for (int i = 1; i <= n;i++){
        head[i] = sz[i] = 0;
    }
}
signed main(){
    int _;scanf("%d", &_);
    while(_--){
        scanf("%d",&n);
        init();
        for (int i = 1,u,v; i <= n - 1;i++){
            scanf("%d%d", &u, &v);
            add(u, v), add(v, u);
        }
        scanf("%d", &m);
        for (int i = 1; i <= m;i++){
            scanf("%lld", &p[i]);
        }
        sort(p + 1, p + 1 + m);//从大到小
        reverse(p + 1, p + 1 + m);
        dfs(1,1);
        for (int i = 1; i <= n;i++){//先不要取模
            sz[i] = (sz[i]) * (n - sz[i]);
        }
        sort(sz + 1, sz + 1 + n);//从大到小
        reverse(sz + 1, sz + 1 + n);
        ll ans = 0;
        if(n-1>=m){
            for (int i = 1; i <= n-1;i++){
                if(i<=m){
                    ans =(ans+ sz[i]%mod * p[i])%mod;
                }else{
                    ans =(ans+ sz[i])%mod;
                }
            }
        }else{
            for (int i = 2; i <= m;i++){
                if(i<=m-n+2){
                     p[1] = p[1] * p[i]%mod;
                }else{
                    p[i-(m-n+2)+1] = p[i];
                }
            }
            for (int i = 1; i <= n-1; i++){
                ans = (ans + sz[i] * p[i]) % mod;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}
												
											Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)的更多相关文章
- Codeforces Round #665 (Div. 2)  D - Maximum Distributed Tree  dfs贡献记录
		
题意: t组输入,每组数据中n个节点构成一棵树,然后给你n-1条边.给你一个m,然后给你m个k的素数因子,你需要给这n-1条边都赋一个权值,这n-1条边的权值之积应该等于k.如果k的素数因子数量小于n ...
 - 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)
		
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 #524 (Div. 2)(前三题题解)
		
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
 - 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个项链,每条项链左边和右边都有一种颜色(范 ...
 
随机推荐
- JUC---04Lock(二)ReentrantReadWriteLock
			
1.读写锁 分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可.如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁:如果你的代码修改数据,只能 ...
 - java POI Excel 单元格样式
			
正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. 1 package com.my ...
 - LWJGL3的内存管理,第三篇,剩下的两种策略
			
LWJGL3的内存管理,第三篇,剩下的两种策略 上一篇讨论的基于 MemoryStack 类的栈上分配方式,是效率最高的,但是有些情况下无法使用.比如需要分配的内存较大,又或许生命周期较长.这时候就可 ...
 - mns: Money Never Sleeps! 自己开发的一款 IDEA 插件介绍.
			
一边敲代码, 一边关注股票/基金行情, 还不怕同事盯到自己的屏幕! 对于一个关注股市跟基金的研发人员来说, 莫过于一天到晚写代码, 而不能及时的查看股市行情跟基金走势了吧. 写代码的时候比较容易忘记看 ...
 - AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?
			
本文基于JDK-8u261源码分析 1 简介 因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的.所以条件队列的出现为我们提供了主动式地.只有满足指 ...
 - element UI table show-overflow-tooltip属性更改背景色和字体颜色
			
.el-tooltip__popper { width: 80%;/*修改宽度*/ background: #000 !important;/*背景色 !important优先级*/ opacity ...
 - Jmeter-全局变量跨线程组使用
			
一.前言 前面讲了如何使用正则表达式提取值,一般提取的值在同一个线程里,随意哪个请求都是可以引用的,那如果别的线程组也想引用怎么办呢?这时就涉及到一个全局变量的知识点了,话不多说,直接实例走起. 二. ...
 - KepServer与S7-1200PLC之间的OPC通信配置
			
对于学习上位机开发,有一种通信方式是必须要了解的,那就是OPC是OLE for Process Control的简称,然而随着技术的不断发展,人们开始对它有了新的定义,比如Open Platform ...
 - Spring源码之@Lazy和预实例化
			
https://www.cnblogs.com/yanze/p/10243348.html 懒加载优缺点 优点:懒加载,对象使用的时候才去创建:启动速度快,节省资源 缺点:不利于提前发现错误:初次请求 ...
 - struts.xml中的配置内容
			
一些常量的配置 包标签 拦截器标签(自定义拦截器,拦截器栈) //对待拦截器栈与拦截器是一样的,只是标签不同而已. global-results标签 action标签:拦截器标签,resu ...