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. show slave status常用参数备忘

    mysql> show slave status\G*************************** 1. row *************************** Slave_IO ...

  2. Flask+pin

    Flask+SSTI的新火花 记一次buu刷题记和回顾祥云杯被虐出屎的经历.题目:[GYCTF2020]FlaskApp 一 题目初见 朴实无华的页面,一个base64的小程序页面 看到有提示. 我就 ...

  3. C# datagridview设置标题为汉语

    正常情况下,在给datagridview绑定数据源之后,显示的是SQL语句中的栏位,如下 我们想让标题显示汉语,可以有一下两种方法 1.在SQL中设置列别名 SELECT TITLE AS '报警标题 ...

  4. AQS之ReentrantReadWriteLock精讲分析上篇

    1.用法 1.1 定义一个安全的list集合 public class LockDemo { ArrayList<Integer> arrayList = new ArrayList< ...

  5. Genymotion虚拟机用键盘输入中文

    genymotion我用的版本是3.0.4,安卓内核版本从4到9都进行了尝试,尤其是教新的版本原生是不带中文输入法的. 前提:安装Genymotion以后,想要随意安装app,需要先安装Genymot ...

  6. bootstrap弹出层嵌套弹出层后文本框不能获得焦点输入

    如图上 我从页面打开一个bootstrap弹出层 然后又在 bootstrap弹出层的基础上打开一个layui的弹出层  打开后发现文本域获取不到焦点不能输入内容 而该弹出层显示的层级体现出来了 按钮 ...

  7. [Cerc2005]Knights of the Round Table

    题目描述 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少有3个骑士参加,且相互憎恨的骑士不能坐在圆桌的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是大于1的奇数,以防 ...

  8. 关于java并发场景下,HttpServletRequst中session丢失问题

    使用场景: 在list数据进来之后使用安全数组    Lists.newCopyOnWriteArrayList() 进行了   parallelStream  并行处理,在接口中进行了登录者信息接口 ...

  9. ubuntu更新下载软件卡住0% [Connecting to archive.ubuntu.com (2001:67c:1360:8001::23)]

    一台ubuntu系统,查看硬件和配置环境的时候发现下载卡住了 根据提示就是有ipv6地址,系统也是配置了ipv6地址的.海外机器,而且可以ping通域名 最佳解决方案 我想出了如何让apt-get再次 ...

  10. Swagger-UI展示接口

    简单介绍API的管理工具Swagger的UI模块. 简介:swagger ui就是一个能整合到项目中让api的注释能够生成到一个网页上.能简单测试和给前端看. 第一步:添加引用 打开NuGet程序包管 ...