Codeforces Round #530 (Div. 2) F 线段树 + 树形dp(自下往上)
https://codeforces.com/contest/1099/problem/F
题意
一颗n个节点的树上,每个点都有\(x[i]\)个饼干,然后在i节点上吃一个饼干的时间是\(t[i]\),有n-1条边,每条边有边权w为经过一条边所需时间,你从树根开始先手向下走,然后对手割掉你所在节点到子节点的任意一条边,你可以在任何时间选择返回,在返回的过程中你可以选择性吃掉经过节点的饼干,问在双方最优的情况下,你最多能在T时间之内吃掉多少饼干并返回根节点(在足够时间返回根节点的情况下吃掉尽可能多的饼干)
题解
- 对于选择哪个子节点对于双方最优,只有到最后一层节点(叶子)才知道,所以需要从下往上解决问题
- 定义dp[u]为经过节点u并能返回根最多能吃多少饼干,
- u为根,\(dp[u]=max(dp[v])\)
- u不为根,\(dp[u]=max2(dp[v])\),选择第二大,因为最大被对手割掉
- u为叶子,dp[u]为剩下时间lt,所能吃掉的最多的饼干数量
- dp[1]为答案
 
- 权值线段树(时间为x轴)维护路径上能吃的饼干数量num以及所需时间sum,因为到叶子的时候整条路径的饼干情况都标记在线段树上,而一定是从时间小(贪心)的开始吃,所以可以很方便找到sum<=lt最大的num,线段树起了一个类似标记数组的作用
代码
#include<bits/stdc++.h>
#define MAXN 1000005
#define m 1000000
#define ll long long
#define mk make_pair
#define ft first
#define se second
#define pii pair<int,int>
using namespace std;
vector<pii>G[MAXN];
ll sum[MAXN<<2],num[MAXN<<2],T;
int dp[MAXN],t[MAXN],x[MAXN];
int n,u,w;
void ud(int o,int l,int r,int p,int v){
	sum[o]+=1ll*p*v;num[o]+=v;
	if(l==r)return ;
	int mid=(l+r)/2;
	if(p<=mid)ud(o<<1,l,mid,p,v);
	else ud(o<<1|1,mid+1,r,p,v);
}
ll qy(int o,int l,int r,ll lt){
	if(sum[o]<=lt)return num[o];
	if(l==r)return lt/l;
	int mid=(l+r)/2;
	if(lt>=sum[o<<1])return num[o<<1]+qy(o<<1|1,mid+1,r,lt-sum[o<<1]);
	return qy(o<<1,l,mid,lt);
}
void dfs(int u,ll lt){
	if(lt<=0)return;
	ud(1,1,m,t[u],x[u]);
	dp[u]=qy(1,1,m,lt);
	int mx1=0,mx2=0;
	for(auto tp:G[u]){
		int v=tp.ft,w=tp.se;
		dfs(v,lt-2*w);
		if(dp[v]>mx1){mx2=mx1;mx1=dp[v];}
		else if(dp[v]>mx2){mx2=dp[v];}
	}
    if(u==1)dp[u]=max(dp[u],mx1);
    else dp[u]=max(dp[u],mx2);
    ud(1,1,m,t[u],-x[u]);
}
int main(){
	cin>>n>>T;
	for(int i=1;i<=n;i++)scanf("%d",&x[i]);
	for(int i=1;i<=n;i++)scanf("%d",&t[i]);
	for(int i=2;i<=n;i++){
		scanf("%d%d",&u,&w);
		G[u].push_back(mk(i,w));
	}
	dfs(1,T);
	cout<<dp[1];
}
Codeforces Round #530 (Div. 2) F 线段树 + 树形dp(自下往上)的更多相关文章
- Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)
		题:https://codeforces.com/contest/1099/problem/F 题意:给定一个树,每个节点有俩个信息x和t,分别表示这个节点上的饼干个数和先手吃掉这个节点上一个饼干的的 ... 
- Codeforces Round #426 (Div. 2)  D  线段树优化dp
		D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ... 
- Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)
		题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ... 
- CodeCraft-19 and Codeforces Round #537 (Div. 2) E 虚树 + 树形dp(新坑)
		https://codeforces.com/contest/1111/problem/E 题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点 ... 
- Codeforces Round #530 (Div. 2) F (树形dp+线段树)
		F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ... 
- Codeforces Round #530 (Div. 2) F - Cookies
		F - Cookies 思路:我们先考虑如何算出在每个节点结束最多能吃多少饼干, 这个dfs的时候用线段树维护一下就好了, 然后有个这个信息之后树上小dp一下就好啦. #include<bits ... 
- Nastya Hasn't Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)
		题目链接 传送门 题面 题意 给你一个\(a\)数组和一个\(k\)数组,进行\(q\)次操作,操作分为两种: 将\(a_i\)增加\(x\),此时如果\(a_{i+1}<a_i+k_i\),那 ... 
- Codeforces Round #552 (Div. 3)  F. Shovels Shop(dp)
		题目链接 大意:给你n个物品和m种优惠方式,让你买k种,问最少多少钱. 思路:考虑dpdpdp,dp[x]dp[x]dp[x]表示买xxx种物品的最少花费,然后遍历mmm种优惠方式就行转移就好了. # ... 
- Codeforces Round #302 (Div. 1) D - Road Improvement  树形dp
		D - Road Improvemen 思路:0没有逆元!!!! 不能直接除,要求前缀积和后缀积!!! #include<bits/stdc++.h> #define LL long lo ... 
随机推荐
- jboss_log4j.xml配置
			log4j是个优秀的开源的java日志系统,jboss内部也集成他,在jboss下默认的只是对server做了每日日志,并没有对你部署的项目进行每日的日志构建,但我们能通过修改jboss-log4j. ... 
- 三、Spring注解之@Import
			spring注解之@Import [1]@Import  参数value接收一个Class数组,将你传入的类以全类名作为id加入IOC容器中  比较简单,此处不做详细解释 [2]ImportSel ... 
- OpenGL入门1.2:渲染管线简介,画三角形
			每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 图形渲染管线简介 在OpenGL的世界里,任何事物是处于3D空间中的,而屏幕和窗口显示的却是2D,所以OpenGL干的事情基本就是 ... 
- Swagger实例分享(VS+WebApi+Swashbuckle)
			Swagger实例分享(VS+WebApi+Swashbuckle) Swagger可以很方便的为发布的WebApi自动生成优雅的文档,不需额外自己编写,只需为项目配置好,是一个很好用的工具,做一个简 ... 
- 微信和QQ可以关闭广告了,每次能关6个月
			微信和QQ可以关闭广告了,这次腾讯真的是良心了,虽然不能完全关闭,但是每次能关6个月,也能清静不少时间. 关闭地址:点击进入 
- 读 HeadFirst 设计模式
			以往虽也看过相关设计模式的书籍,但能和与HeadFirt设计模式这本书相比不是缺乏严谨性就是缺乏具体应用实例,还有幽默生动以及引人启发的观点. 设计原则 设计原则并不能光靠死记硬背,我们需要通过具体的 ... 
- E203译码模块(3)
			下面的代码译码出指令的立即数,不同的指令有不同的立即数编码形式. //I类型指令的imm,[31:20],符号位扩展成32位. wire [31:0] rv32_i_imm = { {20{rv32_ ... 
- Git 合并单个文件
			有两个分支 # git branch -a * branchA branchB remotes/origin/branchC A分支合并B分支单个文件 注意是本地分支,还是远程分支 # git che ... 
- [git] your branch is ahead of ... 解决办法
			出现该问题表示在次之前已经有X个commite了,执行命令git reset --hard HEAD~X解决其中X表示有多少次提交,此命令的意思是回退到x个commit之前.git reset --h ... 
- HeadFirst设计模式--命令模式
			模式定义 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式 ... 
