CF1466-D. 13th Labour of Heracles

题意:

给出一个由\(n\)个点构成的树,每个点都有一个权值。现在你可以用\(k,k\subset\)\([1, n]\)个颜色来给这棵树上的边涂色(这\(k\)种颜色不一定都要用上)。对于每种颜色都有一个权重,权值是这样定义的:

将除了当前颜色\(col_i\)其他颜色的边删掉,剩余的边构成了一个个联通分量。对于任意一个联通分量我们设它的权重是\(w_i\),那么\(w_i\)就等于该联通分量中所有点的权值之和,则对于当前颜色,它的权值就是\(w_{col_i}=max\{w_1, w_2,\cdots,w_n\}\)

需要注意的是,这个联通分量是通过删边得到的,所以不会出现联通分量中只有一个点的情况。对于一个空的联通分量,我们认为它的权重为0。

现在又定义对于每个\(k\)也有一个权值,它等于它包含的所有颜色的权值之和,即\(w_k=\sum_{i=1}^kw_{col_i}\).

现在让你求出对于每个\(k\),它的权值\(w_k\)的最大值是多少。


思路:

首先非常显然的一个道理,我们不能涂完颜色后让一个或多个颜色被分割成多个联通分量然后取\(max\),这样无论如何都不可能比单一的联通分量的权值大。

我们可以试着模拟从涂一个颜色到涂两个颜色的过程, 变化的就是让其中一个点从只被计算一次变成被计算两次,对于从两个颜色到三个,三个到四个...都可以依次推广得到相同的结论。所以这里利用贪心的思想优先让权值大的点先被计算多次,再依次减少。

对于每一个点,他能够被计算的最多的次数就是它的度\((degree)\)。当\(k=1\)的时候,它的最大值只有一个就是每个点的权值之和。这时候每个边都会被计算一次,所有的边度都减去一,对于剩下的所有度还大于1的点,我们就按照上面说到的贪心方法进行计算就可以得到最终结果。


AC代码:

这段代码我借鉴了一些大佬的数据处理方法。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> typedef long long ll; const int maxn = 200005; ll w[maxn], a[maxn << 1];
int deg[maxn], tot = 0; int main() {
int cases, n;
scanf("%d", &cases);
while(cases--) {
tot = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
deg[i + 1] = 0;
scanf("%lld", &w[i + 1]);
}
int u, v;
for (int i = 1; i < n; i++) {
scanf("%d %d", &u, &v);
deg[u]++; deg[v]++;
}
ll ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < deg[i]; j++) {
a[tot++] = w[i];
}
ans += w[i];
}
std::sort(a, a + tot, std::greater<int>());
for (int i = 0; i < tot; i++) {
printf("%lld ", ans);
ans += a[i];
}
printf("%lld\n", ans);
} return 0;
}

CF1466-D. 13th Labour of Heracles的更多相关文章

  1. 0001-Weekly Meeting on 13th and 20th March, 2015

    13th March, 2015 (1) Nearest Neighbors Using Compact Sparse Coding  ->appearing in ICML2014       ...

  2. The 13th tip of DB Query Analyzer, powerful processing EXCEL file

    The 13thtip of DB Query Analyzer, powerful processing EXCEL file MA Genfeng (Guangdong UnitollServic ...

  3. October 13th 2016 Week 42nd Thursday

    If the world seems cold to you, kindle fires to warm it. 若世界以寒相待,请点燃火堆以温暖相报. Kindle fires to warm th ...

  4. August 13th 2016 Week 33rd Saturday

    What makes life dreary is the want of motive. 没有目标与动力,生活便会郁闷无光. Without dreams and hope, there will ...

  5. The 13th Zhejiang Provincial Collegiate Contest(2016年浙江省赛)

      前4道水题就不说了,其中我做了C题,1Y,小心仔细写代码并且提交之前得确认无误后提交才能减少出错率. 结果后面2题都由波神做掉,学长带我们飞~ 终榜 官方题解   ZOJ 3946 Highway ...

  6. July 13th, Week 29th Wednesday, 2016

    Travel imparts new vigor to the mind. 旅行能给思想带来新的活力. Travel can give us opportunities to experience m ...

  7. February 13th, 2018 Week 7th Tuesday

    You are your greatest asset. 你就是你自己最大的资本. For most of us, there are few things that we can count on ...

  8. January 13th, 2018 Week 02nd Saturday

    Anyone who has no spiritual aspirations is an idiot. 任何没有精神追求的人都是愚昧无知的人. Today I went to a bookshop ...

  9. November 13th, 2017 Week 46th Monday

    Don't undermine your worth by comparing yourself with others. 别拿自己和他人比较,这只会降低你原有的价值. Honestly, I don ...

随机推荐

  1. 单元测试:单元测试中的mock

    公司要求提升单元测试的质量,提高代码的分支覆盖率和行覆盖率,安排我研究单元测试,指定方案分享并在开发部普及开.整理完资料后,同步一下到博客. 单元测试中的mock的目的 mock的主要目的是让单元测试 ...

  2. Oracle Rac to Rac One Node

    =~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2020.01.14 20:05:12 =~=~=~=~=~=~=~=~=~=~=~= [oracle@rac01 ~]$ srvc ...

  3. 史上最全postgreSQL体系结构(转)

    原文链接:https://cloud.tencent.com/developer/article/1469101 墨墨导读:本文主要从日志文件.参数文件.控制文件.数据文件.redo日志(WAL).后 ...

  4. postgresql数据库升级

    pg_upgrade官网介绍:https://www.postgresql.org/docs/10/pgupgrade.html 1.查看老版本数据库编译参数值并记录 select name,sett ...

  5. 鸿蒙的远程交互组件应用及微信小程序的远程交互组件应用

    注:鸿蒙的远程交互组件应用相对复杂 ,访问网络时,首先要配置网络权限,华为官方文档有问题,在此引用我老师配置的模板,见附件 过程:1.导入鸿蒙的网络请求模块fetch 2.发起对服务器的请求(在这过程 ...

  6. BAPI_MATERIAL_BOM_GROUP_CREATE创建BOM

    天使用BAPI函数:BAPI_MATERIAL_BOM_GROUP_CREATE创建BOM组数据,过程中发现很多问题啊.总结如下: BOMGROUP        VARIANTS 这两个参数必须要传 ...

  7. typora+PicGo+gitee搭建免费的的床

    一.gitee 1.第一步拥有自己的gitee账号 没有的可以自己去注册gitee地址 2.使用自己的gitee账号创建仓库 创建好之后注意 记住.com/以后的地址 此处就为y***L/photo- ...

  8. JVM重新认识(一)oop-klass模型--HSDB使用验证

    一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的. ...

  9. Navicat 创建mysql存过、定时执行存过

    创建存过: 使用Navicat for MySQL工具创建存储过程步骤: 1. 新建函数(选择函数标签 -> 点击新建函数): 2.输入函数的参数个数.参数名.参数类型等: 3.编写存储过程: ...

  10. Linux 通过端口终止进程

    以下命令可用于杀死占用某端口的所有进程. root 用户: kill -9 $(lsof -i tcp:进程号 -t) 非 root 用户: kill -9 $(sudo lsof -i tcp:进程 ...