SSL_2570【幸福的道路】

博客探讨了如何使用树形动态规划(DP)解决一个关于寻找连续晨练天数的问题,其中幸福值波动不超过特定限制。通过单调队列和两次DFS遍历,可以找出每个节点的最大和次长路径,从而确定最长连续锻炼天数。
摘要由CSDN通过智能技术生成

幸福的道路

题目

小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光.
他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图.
他们不愿枯燥的每天从同一个地方开始他们的锻炼,所以他们准备给起点标号后顺序地从每个起点开始(第一天从起点一开始,第二天从起点二开始……). 而且他们给每条道路定上一个幸福的值.很显然他们每次出发都想走幸福值和最长的路线.
他们不愿再经历之前的大起大落,所以决定连续几天的幸福值波动不能超过M.他们想知道要是这样的话他们最多能连续锻炼多少天(hint:不一定从第一天一直开始连续锻炼)?
现在,他们把这个艰巨的任务交给你了!

Input

第一行包含两个整数N, M(M<=10^9).
第二至第N行,每行两个数字Fi , Di, 第i行表示第i个节点的父亲是Fi,且道路的幸福值是Di.

Output

最长的连续锻炼天数

Sample Input

3 2
1 1
1 3

Sample Output

3

解析

单调队列还算好写虽然打挂了一次,倒是这题来个树上DP
思路:单调队列保存最大最小,每次比较踢出即可
树上DP先DFS一次,求出每个点只向下时的最长路和次长路
再DFS一次,补充可向上时的最长路和次长路

code:

#include<cstdio>
#include<deque>
using namespace std;
inline bool idigit(char x){
   return (x<'0'|x>'9')?0:1;}
inline int read()
{
   
	int num=0,f=1;
	char c=0;
	while(!idigit(c=getchar())){
   if(c=='-')f=-1;}
	while(idigit(c))num=(num<<1)+(num<<3)+(c&15),c=getchar();
	return num*f;
}
inline void write(int x)
{
   
	int F[20];
	int tmp=x>0?x:-x
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值