description

权限题。
树上\(n\)个节点每个节点都有一种物品,每种物品有其价值,价格,数量,只能买一个连通块中的物品,求\(m\)元能买到物品价值的最大值。

data range

\[ n\le 500,m\le 4000,T\le 5,c_i\le m\]

solution

紧跟\(YCB\)聚聚的步伐

首先可以想到以每个点为根做树形依赖背包

树形依赖背包

设\(f[i][j]\)表示在子树\(i\)中买了价值为\(j\)的物品

如果直接对父亲转移是每次\(O(nc^2)\)的

我们把每个连通块考虑成一条路径,如果选某个点就前往这个点\(dfn\)序的下一个点,
如果不选就跳过整棵子树做转移

这样做再加上多重背包的单调队列优化可以达到每次\(O(nc)\)

总复杂度为\(O(n^2c)\)

然后套一下点分治或者\(dsu\ on\ tree\)都可以

code

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FILE "a"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=510;
const int M=4010;
const dd pi=acos(-1);
const int inf=mod;
const ll INF=1e18+1;
const ll P=100000;
il ll read(){RG ll data=0,w=1;RG char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')w=-1,ch=getchar();while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();return data*w;
}il void file(){srand(time(NULL)+rand());freopen(FILE".in","r",stdin);freopen(FILE".out","w",stdout);
}int n,m,w[N],c[N],d[N],ans;
int head[N],nxt[N<<1],to[N<<1],cnt;
int sz[N],son[N],dfn[N],fw[N],cntw;
void dfs1(int u,int fa){sz[u]=1;son[u]=0;for(RG int i=head[u];i;i=nxt[i]){RG int v=to[i];if(v==fa)continue;dfs1(v,u);sz[u]+=sz[v];if(sz[son[u]]<sz[v])son[u]=v;}
}
void dfs2(int u,int fa){dfn[u]=++cntw;fw[cntw]=u;for(RG int i=head[u];i;i=nxt[i]){RG int v=to[i];if(v==fa||v==son[u])continue;dfs2(v,u);}if(son[u])dfs2(son[u],u);
}int dp[N][M],q[M],l,r;
il void upd(int &a,int b){a=a>b?a:b;}
il void work(int *f1,int *f2,int u){for(RG int i=0,ret;i<c[u];i++){l=1;r=0;for(RG int j=0;j*c[u]+i<=m;j++){while(l<=r&&j-q[l]>d[u])l++;ret=l>r?-inf:f2[q[l]*c[u]+i]+(j-q[l])*w[u];upd(f1[j*c[u]+i],ret);while(l<=r&&f2[q[r]*c[u]+i]<=f2[j*c[u]+i]+(q[r]-j)*w[u])r--;q[++r]=j;}}
}void dsu(int u,int fa,int k){for(RG int i=head[u];i;i=nxt[i]){RG int v=to[i];if(v==fa||v==son[u])continue;dsu(v,u,0);}if(son[u])dsu(son[u],u,1);for(RG int i=0;i<=m;i++)dp[fw[dfn[u]+sz[u]]][i]=-inf;dp[fw[dfn[u]+sz[u]]][0]=0;for(RG int i=dfn[u]+sz[u]-sz[son[u]]-1;i>=dfn[u];i--){RG int x=fw[i];for(RG int j=0;j<=m;j++)dp[x][j]=-inf;if(x!=u)for(RG int j=0;j<=m;j++)upd(dp[x][j],dp[fw[i+sz[x]]][j]);work(dp[x],dp[fw[i+1]],x);}for(RG int i=0;i<=m;i++)upd(ans,dp[u][i]);if(k){for(RG int i=0;i<=m;i++)dp[u][i]=-inf;for(RG int i=0;i<=m;i++)upd(dp[u][i],dp[fw[dfn[u]+sz[u]]][i]);work(dp[u],dp[fw[dfn[u]+1]],u);}
}int main()
{RG int T=read();while(T--){n=read();m=read();ans=-inf;fw[n+1]=n+1;cnt=cntw=0;memset(head,0,sizeof(head));for(RG int i=1;i<=n;i++)w[i]=read();for(RG int i=1;i<=n;i++)c[i]=read();for(RG int i=1;i<=n;i++)d[i]=read();for(RG int i=1,u,v;i<n;i++){u=read();v=read();to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;to[++cnt]=u;nxt[cnt]=head[v];head[v]=cnt;}       dfs1(1,0);dfs2(1,0);dsu(1,0,0);     printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/cjfdf/p/9540057.html

[BZOJ4182]Shopping相关推荐

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

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

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

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

  3. 树上连通有关背包:【BZOJ4182】shopping 【HDU6566】The Hanged Man

    选这两道题是因为这两道题都是树上背包,而且选的点的要求都与连通性有关,而且都是按 dfs 序 DP 来模拟不断加入物品,而且都能用树剖和点分治优化(不过优化的点一个跟子树大小有关一个跟深度有关),比较 ...

  4. 指南:如何运用谷歌Google Shopping和Product Listing Ads

    指南:如何运用谷歌Google Shopping和Product Listing Ads 如果你在网上卖东西给外国人,那么你就没有理由不使用Google Shopping. 图片来源:123rf.co ...

  5. 【题意分析】1044 Shopping in Mars (25 分)【滑动窗口】

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Shopping in Mars is quite a different experience. The Mars people ...

  6. 职业高中计算机英语教案,职高英语shopping教学设计.doc

    职高英语shopping教学设计 PAGE PAGE 1 职高英语"shopping"的教学设计 深圳市沙井职业高级中学 李慧莉 一 教学设计理念: 1.教材简析:<商务英语 ...

  7. USACO 3.3.2 Shopping Offers解题报告

    写在前面:因为之前没写的C++的USACO Training的解题报告太多--所以就不写了,要是想要代码可以联系我:xiedong_1993@foxmail.com 这题就是传说中的五维背包,其实写起 ...

  8. 数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls

    可检验模板正确度 An Easy Problem?! Ancient Berland Circus Open-air shopping malls An Easy Problem?! problem ...

  9. codeforces1440 E. Greedy Shopping

    昨天晚上做完4题还有30分钟,感觉太晚了就没继续写,不过看了下E题感觉是一个线段树题目,今天中午看了看发现就是一个线段树上递归的询问问题,不过我之前没写过但是靠着日益强大的乱写能力竟然水出来了~~ E ...

最新文章

  1. Android 取得 ListView中每个Item项目的值
  2. 当定时任务遇上随机数
  3. 小团队 vs 大团队
  4. 项目怎么查服务器,服务器查询项目标签
  5. 密码流 PassWord.java
  6. Zookeeper集群搭建方法
  7. python 保存csv文件
  8. 大话ion系列(五)
  9. 华米 OV 一加“征服”印度?!
  10. 活动目录系列之十二:活动目录的修复(下)
  11. 构建tcpdump/wireshark pcap文件
  12. 飞船利用计算机进行飞行状态调整属于,“神舟八号”飞船利用计算机进行飞行状态调整属于____。...
  13. [算法导论] 邮递员问题代码c++实现,Floyd算法+dp,求遍历所有边回到起点的最短路径
  14. android 4.4 投屏,安卓投屏助手官方
  15. 融云主办 WICC 2020 探寻互联网通信云技术风向标
  16. 组织人事类主数据业务梳理以及流程编排
  17. Oracle对象——视图之简单视图与视图约束
  18. js正则表达式的使用:
  19. 湖南文理学院第十六届程序设计竞赛_题解
  20. 西邮linux小组面试题总结(2016-5-30)

热门文章

  1. android p wifi一直在扫描_在Android上的每次WiFi扫描之间我应该使用什么时间间隔?...
  2. java 什么是线程同步,java多线程同步集合是什么?并发集合是什么?
  3. 2、IDEA以新窗口的形式打开多个项目
  4. 网络知识:宽带下载网速是30MB/s,经过路由器后仅10MB/s,看完你就懂了!
  5. 综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?
  6. net以execl做数据库_[原创]Net实现Excel导入导出到数据库(附源码)
  7. android sdk eclipse没导入,Android—新的eclipse导入SDK出错解决办法
  8. php接口和java接口_java和php接口的区别是什么
  9. cookie,session的区别和联系(补充token)
  10. ux的重要性_UX中清晰的重要性