整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


CF1401D Maximum Distributed Tree(树上贪心)

给定一棵 nnn 个节点,n−1n-1n−1 条边的树。你可以在每一条树上的边标上边权,使得:

每个边权都为 正整数;
这 n−1n-1n−1 个边权的 乘积 等于 kkk;
边权为 111 的边的数量最少。
定义 f(u,v)f(u,v)f(u,v) 表示节点 uuu 到节点 vvv 的简单路径经过的边权总和。你的任务是让 ∑i=1n−1∑j=i+1nf(i,j)i=1\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} f(i,j) i=1i=1∑n−1​j=i+1∑n​f(i,j)i=1最大。

最终答案可能很大,对 109+710^9+7109+7 取模即可。

kkk 有可能很大,输入数据中包含了 mmm 个质数 pip_ipi​ ,那么kkk 为这些质数的乘积。

Solution

显然 ∑i=1n−1∑j=i+1nf(i,j)i=1\displaystyle \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} f(i,j) i=1i=1∑n−1​j=i+1∑n​f(i,j)i=1 的含义就是图中任意两点间的路径长度之和。
我们可以从边的贡献出发,显然对于任意一条边 ,从该条边经过的路径条数显然就是 siz[x]×(n−siz[x])siz[x]\times (n-siz[x])siz[x]×(n−siz[x])。
所以我们贪心就行了…
排序后,给经过次数多的分配最大的权值即可。
显然乘法比加法大的多(

但是因为题目要求 的数量最少,所以我们并不能直接把 送给次数最多的那个,我们需要把 p 从小到大先分配给小的,然后剩余的一块给大的。
所以根据 够不够分,分类讨论即可。
最后,有取模的时候不能直接排序,因为很大的数模完之后可能会变得很小

Code

// Problem: CF1401D Maximum Distributed Tree
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1401D
// Memory Limit: 250 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>using namespace std;
#define int long long
const int N = 5e5 + 7, M = 3e6 + 7, mod = 1e9 + 7;int n, m, s, t, ans, a[N];
int p[N], val[N];
int head[N], ver[M], nex[M], ede[M], tot;
bool vis[N];
int siz[N];
int seq[N], num1;void add(int x, int y)
{ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void dfs(int x, int fa)
{siz[x] = 1;for (int i = head[x]; ~i; i = nex[i]) {int y = ver[i];if(y == fa) continue;dfs(y, x);siz[x] += siz[y];}if(fa != 0)seq[ ++ num1] = siz[x] * (n - siz[x]);
}signed main()
{scanf("%lld", &t);while(t -- ) {ans = 0;num1 = 0;tot = 0;memset(head, -1, sizeof head);memset(val, 0, sizeof val);scanf("%lld", &n);for (int i = 1; i <= n - 1; ++ i) {int x, y;scanf("%lld%lld", &x, &y);add(x, y);add(y, x);}scanf("%lld", &m);for (int i = 1; i <= m; ++ i)scanf("%lld", &p[i]);sort(p + 1, p + 1 + m);dfs(1, 0);sort(seq + 1, seq + 1 + num1);if(n - 1 < m) {for (int i = 1; i <= n - 1; ++ i)val[i] = p[i]; for (int i = n; i <= m; ++ i)val[n - 1] = val[n - 1] * p[i] % mod;}else {for (int i = 1; i <= m; ++ i)val[i] = p[i];for (int i = m + 1; i <= n - 1; ++ i)val[i] = 1; sort(val + 1, val + 1 + n - 1); }  for (int i = 1; i <= n - 1; ++ i)ans = (ans + 1ll * seq[i] * val[i] % mod) % mod;cout << ans << endl;}return 0;
}

Codeforces Round #665 (Div. 2) Maximum Distributed Tree(树上贪心)相关推荐

  1. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  2. Codeforces Round #665 (Div. 2) 题解( 小学奥数专场 )

    目录 A.Distance and Axis(简单高中数学应用题) B.Ternary Sequence(分类讨论) C.Mere Array(GCD的性质) D.Maximum Distribute ...

  3. Codeforces Round #665 (Div. 2)

    2020/8/21 晚上打完球就22:10了,愣是没报上名(cf打不开,然后就做了一下赛后交的过了3个题 A - Distance and Axis 数学题分类讨论一下即可 #define IO io ...

  4. Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心

    Codeforces Round #297 (Div. 2)C. Ilya and Sticks Time Limit: 2 Sec  Memory Limit: 256 MB Submit: xxx ...

  5. Codeforces Round #375 (Div. 2) F. st-Spanning Tree 生成树

    F. st-Spanning Tree 题目连接: http://codeforces.com/contest/723/problem/F Description You are given an u ...

  6. Codeforces Round #168 (Div. 2)D. Zero Tree(DP,中等难度)

    D. Zero Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. 【Codeforces Round #544 (Div. 3) F2. Spanning Tree with One Fixed Degree】DFS

    F2. Spanning Tree with One Fixed Degree 题意 给你nnn个点mmm条边的无向联通图,找出一棵生成树,使111这个点的度=d=d=d. 1≤n,m≤1051 \l ...

  8. CodeCraft-22 and Codeforces Round #795 (Div. 2) F. K-Set Tree

    题目链接 题意 给定一个树,f(r,S)f(r,S)f(r,S) 表示该树以 rrr 为根,节点 VVV 的子集 ∣S∣=k|S|=k∣S∣=k,包含 SSS 的最小子树的大小.求所有 f(r,S)f ...

  9. Codeforces Round #301 (Div. 2) B. School Marks 构造/贪心

    B. School Marks Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/probl ...

最新文章

  1. 地址本在不同手机间的迁移
  2. Cloud一分钟 | 阿里云将在英国大区设立数据中心
  3. Win7,Win8下多实例运行Excel2010
  4. 廖雪峰python教程-Python 2.7教程
  5. HFSS脚本建模入门
  6. 【同态加密算法的学习日记】
  7. 录屏音画不同步的快速解决办法
  8. 带你玩转软件项目测试管理——项目研发管理模式(一)
  9. 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
  10. 定时关机win10_巧用任务计划程序定时关机
  11. 使用网上成熟的【MySqlBackup】组件,通过WEB网页操作,备份远程计算机中的数据库到C:\inetpub\wwwroot文件夹下,系统汇报错误(访问被拒绝),该如何解决呢?
  12. 微信小程序 - 音乐播放器源码
  13. 正在通过app store进行鉴定解决方案
  14. 云端地球新会员重磅上线,快来解锁最全权益地图!
  15. Java空指针异常和解决办法
  16. 微信小程序 - 进阶(自定义组件、promis化、mobx、分包、自定义tabBar)
  17. win7系统做网站服务器,win7系统做网站服务器
  18. uIP1.0 主动发送的问题理解
  19. 计算机辅助电路与设计试卷,计算机辅助电路设计_习题集(含答案).doc
  20. raid配置(详解)

热门文章

  1. 【OpenCV 4开发详解】图像距离变换
  2. IDEA 小技巧之书签与收藏
  3. iOS:CALayer核心动画层
  4. 【JAVA笔记——道】对象生命周期详解
  5. 基于HTML5的WebGL结合Box2DJS物理应用
  6. Response.Redirect 打开新窗体的两种方法
  7. SQL text字段的替换处理(无法批量更新,写法记录)
  8. html景图片怎么设置百分比,8个风光照片拍摄技巧
  9. linux内核页高速缓存,《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写(示例代码)...
  10. Python趣味编程小技巧,图片转炫酷字符画,一看就是高手