vjudge

sol

树DP。

首先把模型转换成:每个点可以控制与它距离不超过\(w_i\)的点,先要求选出数量最少的点控制所有点。

设\(f[i][-100...100]\)表示\(i\)号点向上还可以额外控制距离为\(j\)的点的选点最少数量。

\(j\)为负则表示\(j\)子树中还有\(-(j+1)\)深度的点没有控制。(比如说,\(j=-1\)说明\(i\)号点还没有被控制,\(j=-2\)说明\(i\)的儿子还没有被控制)

这样一来显然\(j\)越大时的状态是越优的。所以可以对每一层的\(f\)数组取一个后缀最大值

然后考虑转移。

如果选\(i\)号点:\(f[i][w_i]=min(1+\sum f[v][-w_i])\)

不选:

当\(j>=0\)时,\(f[i][j]=min(f[x][j+1]+\sum f[y][-j])\)

(其中\(x\)是\(i\)的一个儿子,\(y\)是剩下的全部儿子)

当\(j<0\)时,\(f[i][j]=min(\sum f[v][j+1])\)

直接转啊。

code

hdu上要手开无限栈,不然会RE的(别问我怎么知道的)

如果你也是因为栈溢出RE了就到我代码里面蒯无限栈吧。

#include<cstdio>
#include<algorithm>
#include<cstring>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1e5+5;
int n,w[N],to[N<<1],nxt[N<<1],head[N],cnt,f[N][202],sum[N][202];
void link(int u,int v){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;}
void dfs(int u,int fa)
{
memset(f[u],63,sizeof(f[u]));
memset(sum[u],0,sizeof(sum[u]));
for (int e=head[u];e;e=nxt[e])
if (to[e]!=fa)
{
dfs(to[e],u);
for (int i=-100;i<=100;++i)
sum[u][i+100]+=f[to[e]][i+100];
}
for (int i=0;i<=100;++i)
for (int e=head[u];e;e=nxt[e])
if (to[e]!=fa)
f[u][i+100]=min(f[u][i+100],f[to[e]][i+101]+sum[u][-i+100]-f[to[e]][-i+100]);
for (int i=-100;i<0;++i) f[u][i+100]=min(f[u][i+100],sum[u][i+101]);
f[u][w[u]+100]=min(f[u][w[u]+100],sum[u][-w[u]+100]+1);
for (int i=99;i>=-100;--i) f[u][i+100]=min(f[u][i+100],f[u][i+101]);
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
memset(head,0,sizeof(head));cnt=0;
for (int i=1;i<=n;++i) w[i]=gi();
for (int i=1;i<n;++i)
{
int u=gi(),v=gi();
link(u,v);link(v,u);
}
dfs(1,0);
printf("%d\n",f[1][100]);
}
return 0;
}

[HDU5290]Bombing plan的更多相关文章

  1. 2015 Multi-University Training Contest 1 hdu 5290 Bombing plan

    Bombing plan Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  2. hdu 5290 Bombing plan

    http://acm.hdu.edu.cn/showproblem.php?pid=5290 题意: 一棵树,每个点有一个权值wi,选择点i即可破坏所有距离点i<=wi的点,问破坏所有点 最少需 ...

  3. Bombing HDU, 4022(QQ糖的消法)

    Bombing From:HDU, 4022 Submit Time Limit: 4000/2000 MS (Java/Others)      Memory Limit: 65768/65768 ...

  4. hdu 4022 Bombing

    Bombing Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Sub ...

  5. HDU4022 Bombing STL

    Bombing Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Su ...

  6. 2015 Multi-University Training Contest 1 题解&&总结

    ---------- HDU 5288 OO’s Sequence 题意 给定一个数列(长度<$10^5$),求有多少区间[l,r],且区间内有多少数,满足区间内其它数不是他的约数. 数的范围$ ...

  7. HDU 4022 stl multiset

    orz kss太腻害了. 一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include ...

  8. 2015 Multi-University Training Contest 1(7/12)

    2015 Multi-University Training Contest 1 A.OO's Sequence 计算每个数的贡献 找出第\(i\)个数左边最靠右的因子位置\(lp\)和右边最靠左的因 ...

  9. 测试计划(Test Plan)

    测试计划(Test Plan) 版权声明:本文为博主原创文章,未经博主允许不得转载. 测试计划的概念: 测试计划是一个文档,描述了进行测试的测试范围,测试策略和方法,测试资源和进度.是对整个测试活动进 ...

随机推荐

  1. 闪屏Flash动画

    这个也比较简单,之前也做过不少 今天这个就为了方便日后使用,希望大家都可以借鉴借鉴啊! @ViewInject(R.id.linMain) private LinearLayout linMain; ...

  2. Java学习笔记——java介绍

    Java开源语言 C语言闭源语言 IOS闭源系统  采用object-c语言开发 应用程序分类(从类型分类) C/S(Client Server):不联网的软件也属于C/S B/S(Browser S ...

  3. [原创]关于absolute、relative和float的一些思考

    absolute: 元素完全脱离文档流,不占文档流的位置,不使用top.left等属性时,仍然在原文档流位置上(但是不在文档流中,也不占用位置),设置了top.left等之后,向上寻找到第一个非sta ...

  4. 九度OJ 1207:质因数的个数 (质数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5939 解决:1926 题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有 ...

  5. Netty Redis 亿级流量 高并发 实战 (长文 修正版)

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...

  6. ElasticSearch(二十六)修改分词器及定制自己的分词器

    1.默认的分词器 standard 分词器 standard tokenizer:以单词边界进行切分standard token filter:什么都不做lowercase token filter: ...

  7. 自编码器(autoencoder)

    今天我们会来聊聊用神经网络如何进行非监督形式的学习. 也就是 autoencoder, 自编码. 压缩与解压 有一个神经网络, 它在做的事情是 接收一张图片, 然后 给它打码, 最后 再从打码后的图片 ...

  8. TCP标准模板

    伪代码 #创建一个TCP服务器 ss = socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字上 ss.listen() #监听连接 inf_loop: #服务器无线循环 c ...

  9. CenterFactory

    <?php /* 实例3 */ /* 抽象工厂 */ //青铜会员的打折商品 class BronzeRebateCommodity { //描述 public $desc = '青铜会员的打折 ...

  10. 每天一个Linux命令(16)which命令

    which命令用于查找并显示给定命令的绝对路径. 环境变量PATH中保存了查找命令时需要遍历的目录.which指令会在环境变量$PATH设置的目录里查找符合条件的文件.也就是说,使用which命令,就 ...