BZOJ 1908. Pku2054 UVA1205 Color a Tree
看一眼感觉 $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的更多相关文章
- POJ 2054 Color a Tree
贪心.... Color a Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: ...
- Color a Tree[HDU1055]
Color a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- Color a Tree HDU - 6241
/* 十分巧妙的二分 题意选最少的点涂色 使得满足输入信息: 1 x的子树涂色数不少于y 2 x的子树外面涂色数不少于y 我们若是把2转化到子树内最多涂色多少 就可以维护这个最小和最大 如果我们二分出 ...
- 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 ...
- Color a Tree & 排列
Color a Tree 题目链接 好不可做?可以尝试一下DP贪心网络流.DP 似乎没法做,网络流也不太行,所以试一下贪心. 考虑全局中最大权值的那个点,如果它没父亲,那么一定会先选它:否则,选完它父 ...
- Pku2054 Color a Tree
有一个N个结点的有根树,1是这个树的根.现在要对这N个结点依次进行染色,每个结点染色要花费1个单位的时候,同时要满足一个结点仅在其父亲被染色后才可被染色,每个结点有个权值Ci,如果我们在第Ti时间对i ...
- 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 ...
- 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 ...
- [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问
[BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...
随机推荐
- Python---进阶---logging---装饰器打印日志2
### logging - logging.debug - logging.info - logging.warning - logging.error - logging.critical ---- ...
- celery结合redis 使用
使用 Redis¶ 安装¶ 对 Redis 的支持需要额外的依赖.你可以用 celery[redis] 捆绑 同时安装 Celery 和这些依赖: $ pip install -U celery[re ...
- linux运维、架构之路-MySQL(二)
一.SQL语句实战 1.DDL语句——库管理 ①查看数据库 show databases; show databases like 'word%';#模糊查询数据库 ②创建数据库 create dat ...
- for-in语句和with语句、break和continue语句
for-in语句 for-in语句是一种精准迭代语句,可以用来枚举对象的属性,用以遍历一个对象的全部属性. for…in声明用于对数组或者对象的属性进行循环操作: for…in循环中的代码每执行一次, ...
- Java如何进行Base64的编码(Encode)与解码(Decode)
关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便 ...
- nginx做反向代理时出现302错误(转载)
现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文 ...
- vue2.0 之 douban (二)创建自定义组件tabbar
1.大体布局 这个组件分为两部分:第一个是组件的外层容器,第二个是组件的子容器item,子组件里面又分为图片和文字组合.子组件有2个状态,一个默认灰色的状态,一个选中状态,我们来实现一下这个组件的布局 ...
- Ehrenfeucht–Fraïssé game back-and-forth games
w https://en.wikipedia.org/wiki/Ehrenfeucht–Fraïssé game
- 二十四、python中sys模块
'''1.sys.argv:命令行参数List,第一个元素是程序本身路径''' import sys print (sys.argv)-------------------------------[' ...
- Matplotlib字体大小设置
参考:https://blog.csdn.net/henkekao/article/details/72871882 ax = plt.subplot(111) # 设置刻度字体大小 plt.xtic ...