最后选择的一定是树上的一个连通块,考虑树分治,每次只需考虑重心必选的情况,这就变成了以重心为根的树形依赖多重背包问题。

设f[x][j]表示从根节点到x这条路径及其左边的所有节点,以及以x为根的子树的所有节点中,容量为j的背包选取物品所能得到的最大价值。

对于x的儿子y,将f[y]初始值设为f[x]中强制放入一个y,然后将d[y]-1二进制拆分后放入f[y]中,最后将f[x][j]与f[y][j]取个最优解即可。

时间复杂度$O(nm\log n\log d)$。

#include<cstdio>
#define N 510
int T,n,m,i,x,y,ed,g[N],nxt[N<<1],v[N<<1],ok[N<<1],son[N],f[N],size,now;
int a[N],b[N],c[N],dp[N][4010],ans;
inline void add(int x,int y){v[++ed]=y,nxt[ed]=g[x],ok[ed]=1,g[x]=ed;}
inline void up(int&a,int b){if(a<b)a=b;}
void findroot(int x,int y){
son[x]=1;f[x]=0;
for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){
findroot(v[i],x);
son[x]+=son[v[i]];
if(son[v[i]]>f[x])f[x]=son[v[i]];
}
if(size-son[x]>f[x])f[x]=size-son[x];
if(f[x]<f[now])now=x;
}
void dfs(int x,int y,int m){
if(m<=0)return;
int i,j,k,V,W;
for(j=c[x],i=0;j;i++)if((1<<i)<=j){
for(V=a[x]<<i,W=b[x]<<i,k=m;k>=W;k--)up(dp[x][k],dp[x][k-W]+V);
j-=1<<i;
}else{
for(V=a[x]*j,W=b[x]*j,k=m;k>=W;k--)up(dp[x][k],dp[x][k-W]+V);
break;
}
for(i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){
for(j=0;j<=m-b[v[i]];j++)dp[v[i]][j]=dp[x][j]+a[v[i]];
dfs(v[i],x,m-b[v[i]]);
for(j=b[v[i]];j<=m;j++)up(dp[x][j],dp[v[i]][j-b[v[i]]]);
}
}
void solve(int x){
int i;
for(i=0;i<=m-b[x];i++)dp[x][i]=a[x];
for(dfs(x,i=0,m-b[x]);i<=m-b[x];i++)up(ans,dp[x][i]);
for(i=g[x];i;i=nxt[i])if(ok[i])ok[i^1]=0,f[0]=size=son[v[i]],findroot(v[i],now=0),solve(now);
}
int main(){
for(scanf("%d",&T);T--;printf("%d\n",ans)){
scanf("%d%d",&n,&m),ans=0,ed=1;
for(i=1;i<=n;i++)scanf("%d",&a[i]),g[i]=0;
for(i=1;i<=n;i++)scanf("%d",&b[i]);
for(i=1;i<=n;i++)scanf("%d",&c[i]),c[i]--;
for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
f[0]=size=n,findroot(1,now=0),solve(now);
}
return 0;
}

  

BZOJ4182 : Shopping的更多相关文章

  1. [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化)

    [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化) 题面 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树 ...

  2. BZOJ4182 Shopping(点分治+树形dp)

    点分治,每次考虑包含根的连通块,做树形多重背包即可,dfs序优化.注意题面给的di范围是假的,坑了我0.5h,心态炸了. #include<iostream> #include<cs ...

  3. [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)

    4182: Shopping Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 374  Solved: 130[Submit][Status][Disc ...

  4. BZOJ4182: Shopping(点分治,树上背包)

    Description 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树的形状. 第i个商店只卖第i种物品,小苗对于这种物品的喜爱度 ...

  5. bzoj4182 Shopping 点分治+单调队列优化多重背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4182 题解 有一个很直观的想法是设 \(dp[x][i]\) 表示在以 \(x\) 为根的子树 ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. bzoj4182/luoguP6326 Shopping(点分治,树上背包)

    bzoj4182/luoguP6326 Shopping(点分治,树上背包) bzoj它爆炸了. luogu 题解时间 如果直接暴力背包,转移复杂度是 $ m^{2} $ . 考虑改成点分治. 那么问 ...

  8. 【bzoj4182】shopping

    Portal --> bzoj4182 Solution 感天动地..几百年没在场上写点分了的感觉== (然后就写了很久qwq) ​ 不过感觉自己想这道题怎么颇有运气成分==大概是:诶是不是快乐 ...

  9. 【bzoj4182】Shopping 树的点分治+dfs序+背包dp

    题目描述 给出一棵 $n$ 个点的树,每个点有物品重量 $w$ .体积 $c$ 和数目 $d$ .要求选出一个连通子图,使得总体积不超过背包容量 $m$ ,且总重量最大.求这个最大总重量. 输入 输入 ...

随机推荐

  1. [BZOJ1998][Hnoi2010]Fsk物品调度

    [BZOJ1998][Hnoi2010]Fsk物品调度 试题描述 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号,一开 ...

  2. 粒子滤波particle filter和目标跟踪

    粒子滤波用于跟踪,参考:http://www.cnblogs.com/tornadomeet/archive/2012/03/18/2404817.html http://blog.csdn.net/ ...

  3. python4delphi 设置syspath

    详细看demo25的代码 These techniques are demonstrated in Demo25 in the examples folder of your Python for D ...

  4. 关于DCMTK3.6.0源代码编译的总结

    1.DCMTK cmake出来的代码是一样的.MT和MD版本的区别在于DCMTK工程下的每个子工程的代码生成中的MT还是MD,只要修改成为相应的值就可以了. 2.依赖包的选择.依赖包必须与上面中所说的 ...

  5. Linux系统管理员面试50题

    命令nslookup是做什么的? Nslookup 是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具. 你如何把CPU占用率最高的进程显示出来? top -c 按照cpu排序 如果 ...

  6. javascript quine

    javascript有一些奇怪的性质,恩,比如说,非常容易写一个quine,即自己输出自己代码的东西. function a(){console.log(a.toString()+";a() ...

  7. 二模Day2题解

    小明搬家 题目描述 小明要搬家了,大家都来帮忙. 小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼. 最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了.最后大家发现这样混乱地搬运过程效率太 ...

  8. tar: Removing leading `/’ from member names

    tar: Removing leading `/’ from member names+2 分类:Web服务器 标签:tar 3,910人浏览   这并不是一个错误,而是一个警告,原因很简单,就是你在 ...

  9. CSS3弹性盒模型flexbox完整版教程

    http://caibaojian.com/flexbox-guide.html 来自CSS Tricks上的一个教程,原文为:A Complete Guide to Flexbox.文中详细的介绍了 ...

  10. vi命令的基础知识

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,先说说一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您 ...