传送门

看一眼感觉 $dp$,发现状态没法维护

考虑贪心,然后就想了两个错的贪心...

正解好神啊

首先如果权值最大的点能够一步染色那么肯定要染它

意思就是,一旦父节点被染色那么它就要接着被染色

那么把它们父子两合并成一个新的点,其他节点根据原来的边也连上来

考虑新的点的权值要怎么搞,现在既然这个节点包含了两个点,那么把它染色要两个单位时间,而染其他点只要 $1$ 单位时间

此时染它对整颗树产生的额外的代价为 $2$ 乘其他节点权值和,把其他点 $x$ 染色额外代价为 $1$ 乘其他节点 (非 $x$ 节点) 权值和

所以权值为原本节点权值之和除以 $2$,更大的情况也是同样处理,每次合并都计算此时合并的贡献

贡献就是父节点大小乘子节点权值和,因为要把子节点染色得先把父节点染好,此时子节点会产生额外的代价

这样一直合并最后只剩下根节点时答案就出来了,具体看代码吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
int n,rt,val[N],sz[N],fa[N],ans;
inline void clr() { for(int i=;i<=n;i++) fa[i]=val[i]=sz[i]=; ans=; }
void solve()
{
for(int i=;i<n;i++)
{
int x=,p;
for(int j=;j<=n;j++)
if(j!=rt && 1.0*val[x]/sz[x]<1.0*val[j]/sz[j]) x=j;//找到权值最大的点
p=fa[x]; ans+=sz[p]*val[x];//我们这里算的是额外的代价,不包括把本身染色的代价
sz[p]+=sz[x]; val[p]+=val[x];
val[x]=; fa[x]=p;//合并
for(int j=;j<=n;j++)
if(fa[j]==x) fa[j]=p;//其他点按原来关系连上来
}
}
int main()
{
sz[]=;
while()
{
n=read(),rt=read(); int a,b;
if(!n&&!rt) break;
for(int i=;i<=n;i++)
val[i]=read(),ans+=val[i],sz[i]=;//ans初始为所有点染色本身的代价
for(int i=;i<n;i++) { a=read(),b=read(); fa[b]=a; }
solve();
printf("%d\n",ans);
clr();
}
return ;
}

BZOJ 1908. Pku2054 UVA1205 Color a Tree的更多相关文章

  1. POJ 2054 Color a Tree

    贪心....                    Color a Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:  ...

  2. Color a Tree[HDU1055]

    Color a Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. Color a Tree HDU - 6241

    /* 十分巧妙的二分 题意选最少的点涂色 使得满足输入信息: 1 x的子树涂色数不少于y 2 x的子树外面涂色数不少于y 我们若是把2转化到子树内最多涂色多少 就可以维护这个最小和最大 如果我们二分出 ...

  4. POJ 2054 Color a Tree解题报告

    题干 Bob is very interested in the data structure of a tree. A tree is a directed graph in which a spe ...

  5. Color a Tree & 排列

    Color a Tree 题目链接 好不可做?可以尝试一下DP贪心网络流.DP 似乎没法做,网络流也不太行,所以试一下贪心. 考虑全局中最大权值的那个点,如果它没父亲,那么一定会先选它:否则,选完它父 ...

  6. Pku2054 Color a Tree

    有一个N个结点的有根树,1是这个树的根.现在要对这N个结点依次进行染色,每个结点染色要花费1个单位的时候,同时要满足一个结点仅在其父亲被染色后才可被染色,每个结点有个权值Ci,如果我们在第Ti时间对i ...

  7. hdu 6241 Color a Tree 2017 CCPC 哈理工站 L

    Bob intends to color the nodes of a tree with a pen. The tree consists of NN nodes. These nodes are ...

  8. HDU - 6241 :Color a Tree(不错的二分)

    Bob intends to color the nodes of a tree with a pen. The tree consists of NN nodes. These nodes are ...

  9. [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问

    [BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...

随机推荐

  1. Arduino-一些函数

    随机函数: int x=random();  //返回一个整型随机数 int x=random(10);  //返回一个 [0,10) 整型随机数 int x=random(1,8);  //返回一个 ...

  2. kali安装docker以及配置阿里云镜像加速

    1.需求 最近需要用到docker比较多,遂安装使用下,第一次用docker搭建测试环境,不得不说,docker真香.期间遇到了比较多奇奇怪怪的问题,网上的教程也比较多比较乱,遂记录一下. 2.安装d ...

  3. python+selenium实现发送一封带附件的邮件

    163邮件登录首页 登录成功断言是否有退出按钮 点击退出退出登录 from selenium import webdriver import unittest import time class Vi ...

  4. css常用小知识点汇总(一)

    1.文本过多溢出,怎么让他隐藏变成点点点(...)呢? text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-line- ...

  5. MySQL把多条数据给汇总成一条数据

    用到的是这个函数: group_concat() select group_buying_id, group_concat(app_user_ids) from org_user_group grou ...

  6. 【bzoj3162】独钓寒江雪

    *题目描述: *题解: 树哈希+组合数学.对于树的形态相同的子树就一起考虑. *代码: #include <cstdio> #include <cstring> #includ ...

  7. 【WINDOWS】设置路由表实现有线内网,无线外网

    前提!!! 需要有线无线双网卡

  8. 深入理解Spring(一):初识Spring

    深入理解Spring(一):初识Spring 一. Spring介绍        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...

  9. andriod\iphone视频禁止全屏播放

    x-webkit-airplay="true" x5-playsinline="true" webkit-playsinline="true" ...

  10. 几个FFmpeg 视频参数 fps、tbr、tbn、tbc

    我们用Ffplay播放文件或者视频流命令行会出现fps.tbr.tbn.tbc等参数如下图所示 图1 ffplay 播放文件示意图 fps表示平均帧率,总帧数除以总时长(以s为单位). tbr  表示 ...