【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html


题目描述

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

输入

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

输出

最长的连续锻炼天数

样例输入

3 2
1 1
1 3

样例输出

3


题解

树形dp+倍增RMQ+二分,这完全是两道题拼成一道题的啊。。。

先用树形dp求出到某个点最大距离。

设fst[x]表示以x为根的树中点到x的最大距离,fnd[x]表示以x为根的树中,除去fst[x]所在子树以外其余子树中的点到x的最大距离。

这里比较难想,待会分析。

第一次dfs可以直接处理好deep、fst和fnd。

然后考虑如何用x递推出x的儿子y的最远距离。

那么对于y,有2种情况可能构成到y距离最大:在y的父树中、在y的子树中,在y的父树中包括在x的父树中和在x除y以外的子树中。

在y的子树中即为fst[y],在x除y以外的子树中,需要判断y是否为构成到点x的最大距离的点所在的子树:如果是fst则取fnd,否则取fst。

这样就能够dp求出到某个点最大距离。

然后对于每个点,二分后边的位置,RMQ预处理,O(1)求出区间极差,判断一下即可。

#include <cstdio>
#include <algorithm>
using namespace std;
int head[1000010] , to[2000010] , next[2000010] , cnt , n , k , p , q;
int len[2000010] , fst[1000010] , fnd[1000010] , ff[1000010] , deep[1000010] , minn[1000010][22] , maxn[1000010][22] , log[1000010];
void add(int x , int y , int z)
{to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
void dfs1(int x , int fa)
{int i , y;for(i = head[x] ; i ; i = next[i]){y = to[i];if(y != fa){deep[y] = deep[x] + len[i];dfs1(y , x);if(fst[y] + len[i] > fst[x]) fnd[x] = fst[x] , fst[x] = fst[y] + len[i];else if(fst[y] + len[i] > fnd[x]) fnd[x] = fst[y] + len[i];}}
}
void dfs2(int x , int fa)
{int i , y;for(i = head[x] ; i ; i = next[i]){y = to[i];if(y != fa){if(fst[x] - len[i] == fst[y]) ff[y] = max(ff[x] + len[i] , fnd[x] + len[i]);else ff[y] = max(ff[x] + len[i] , fst[x] + len[i]);dfs2(y , x);}}
}
int getsub(int l , int r)
{int k = log[r - l + 1];return max(maxn[l][k] , maxn[r - (1 << k) + 1][k]) - min(minn[l][k] , minn[r - (1 << k) + 1][k]);
}
int find(int t)
{int l = t , r = n , mid , ans;while(l <= r){mid = (l + r) >> 1;if(getsub(t , mid) <= k) ans = mid , l = mid + 1;else r = mid - 1;}return ans;
}
int main()
{int i , j , x , y , ans = -1;scanf("%d%d" , &n , &k);for(i = 2 ; i <= n ; i ++ ) scanf("%d%d" , &x , &y) , add(i , x , y) , add(x , i , y);dfs1(1 , 0) , dfs2(1 , 0);for(i = 1 ; i <= n ; i ++ ) maxn[i][0] = minn[i][0] = max(ff[i] , fst[i]);for(i = 2 ; i <= n ; i ++ ) log[i] = log[i >> 1] + 1;for(i = 1 ; i <= log[n] ; i ++ )for(j = 1 ; j <= n - (1 << i) + 1 ; j ++ )maxn[j][i] = max(maxn[j][i - 1] , maxn[j + (1 << (i - 1))][i - 1]) , minn[j][i] = min(minn[j][i - 1] , minn[j + (1 << (i - 1))][i - 1]);for(i = 1 ; i <= n - p + 1 ; i ++ )x = find(i) , ans = max(ans , find(i) - i + 1);printf("%d\n" , ans);return 0;
}

 

转载于:https://www.cnblogs.com/GXZlegend/p/6825389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

從三種方式看SQL的使用程度

以下三種方式﹐實現的是同一功能﹐也是我同一天中實現 的三種方式。記載在這里不為別的﹐只為對自己一點SQL的小小總結吧。 UpdateTEMP_PP_SH_MFG_SCH SetMFG_SCH_JOBNO Left(MFG_SCH_JOBNO,6)CASELEN(RIGHT(MFG_SCH_JOBNO,4)ID) WHEN1THE…

android手机用多久会卡机,你知道Android手机用久了会卡,而iPhone则不会是为什么吗?...

原标题&#xff1a;你知道Android手机用久了会卡&#xff0c;而iPhone则不会是为什么吗&#xff1f;如果有人问为什么iPhone能成为手机行业当之无愧的领头羊&#xff1f;为什么那么多人抢着入手iPhone X&#xff1f;为什么黄牛只会炒iPhone手机。我想大多数人的回答就是&#x…

mac 完全卸载mysql

mac 完全卸载mysql 执行下列命令 sudo rm /usr/local/mysqlsudo rm -rf /usr/local/mysql*sudo rm -rf /Library/StartupItems/MySQLCOMsudo rm -rf /Library/PreferencePanes/My*rm -rf ~/Library/PreferencePanes/My*sudo rm -rf /Library/Receipts/mysql*sudo rm -rf /Lib…

有了螃蟹让心情好一点

接到兄弟通过keepc.com发来的免费短信&#xff0c;说昨天发现的技术问题解决了&#xff0c;心情好了点。晚上帮同学作假&#xff0c;花了2个小时&#xff0c;弄了一个号称CRM的丑陋无比的东西&#xff0c;来替她MM糊弄老师&#xff0c;好混过毕业答辩&#xff0c;最近一直没时间…

BaaS后端即服务 - 概念篇

摘要&#xff1a; 什么是BaaS&#xff1f; BaaS&#xff08;Backend as a Service&#xff09;是一种新型的云服务&#xff0c;旨在为移动和Web应用提供后端云服务&#xff0c;包括云端数据/文件存储、账户管理、消息推送、社交媒体整合等。BaaS是垂直领域的云服务&#xff0c;…

android 的监控讲解,java android网络监测详解

public class NetworkCheck {/*** 网络是否可用*/public static boolean isNetworkAvailable(Context context) {ConnectivityManager connectivity (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivity null) {} else {Network…

使用maven构建的Spring boot项目在开始搭建的时候出的一些错误

首先&#xff0c;先构建一个maven项目&#xff0c;构建好了之后&#xff0c;会有一个错误,先说明一下&#xff0c;我生成maven项目时jre给我自动选择的是1.5版本的&#xff0c;而本人安装的是1.8的 然后&#xff0c;我们要消除这个错误&#xff0c;发现是缺少了一个javax.servl…

用计算机计算性别,2018预测生男生女计算器 超准的怀孕计算器查生男生女

外面的大雪不管是如羽毛般飘飞的浪漫还是积雪的盛装都会让夫妻感受到爱情的情愫&#xff0c;有的人在这个时候也计划着在2018年的时候备孕&#xff0c;但是对于各种算术以及数字都难不倒的备孕爸妈来说什么算术都是小菜一碟&#xff0c;2018预测生男生女计算器更是他们的福音&a…

[SPOJ DQUERY] D-query(树状数组,离线)

题目链接&#xff1a;https://vjudge.net/problem/SPOJ-DQUERY 题意&#xff1a;给定数列&#xff0c;q次询问&#xff0c;问区间内不同数字的个数。 可以用主席树&#xff0c;但是还有更好写的办法。 离线存下所有的询问&#xff0c;按照询问右端点从小到大排序。 用树状数组标…

加点自已内容的新内核下L7-FILTER的应用实例!

加点自已内容的新内核下L7-FILTER的应用实例! 转载自&#xff1a;如下BLOG [url]http://pc100.blogbus.com/index.html[/url]本人实验的环境&#xff1a;RED HAT LINUX AS4 &#xff08;KERNEL 2.6.9&#xff09;1.下载linux-2.6.13.tar.bz2iptables-1.3.3.tar.bz2patch-o-mati…

html分享插件,10个jQuery插件分享

10个jQuery插件分享Sponsor发觉现在国外的前端人员很有创意&#xff0c;每个精品jQuery插件大部分来自国外&#xff0c;所以我很欣赏他们。今天为大家带来一些有意思的jQuery插件&#xff0c;这些jQuery有图片类插件、Tool Tips类插件、文字、绘图、排版等&#xff0c;我想这些…

OCR识别算法深入分析手机端车牌识别

一、手机端车牌识别OCR识别流程 车牌识别是基于OCR识别的一用应用。手机端车牌识别过程包括图像采集、图像预处理、车牌定位、字符分割、字符识别、输出结果等一系列算法运算&#xff0c;其流程如下图所示&#xff1a; 其中图像采集是通过视频流识别&#xff0c;对视频进行解帧…

org.springframework.beans.factory.BeanDefinitionStoreExcept

今天写了一个spring的测试demo 新建一个UserWzy类 新建一个spring的配置文件放在src目录下 新建一个测试类 运行报错如下 解决办法&#xff1a; 把配置文件放在resources目录下 再次启动 可以看到了输出了对象的地址

QTP脚本示例

例如&#xff0c;以下语句指示 QuickTest 选中 Itinerary 网页上的所有复选框&#xff1a; Set MyDescription Description.Create() MyDescription("html tag").Value "INPUT" MyDescription("type").Value "checkbox" Set Checkb…

国开计算机应用基础中考答案,国开计算机应用基础模块4PowerPoint2010电子演示文稿系统答案...

"在PoewrPoint中&#xff0c;“视图”这个名词表示( )。: 一张正在修改的幻灯片; 一种图形; 显示幻灯片的方式; 编辑演示文稿的方式""在下列PowerPoint的各种视图中&#xff0c;可编辑、修改幻灯片内容的视图是( )。: 普通视图; 幻灯片浏览视图; 都可以; …

第一阶段冲刺(第七天)

昨天&#xff1a;学习了listview的用法&#xff0c;对以后从数据库中提取数据生成相应的按钮打下了基础 今天&#xff1a;进行了报表界面的设计 问题&#xff1a;如何生成报表还不是很清楚&#xff0c;需要进一步学习&#xff01;转载于:https://www.cnblogs.com/lhj1017/p/684…

手动加载spring, ApplicationContext怎么销毁

手动加载spring&#xff0c; ApplicationContext怎么销毁 AbstractApplicationContext context new ClassPathXmlApplicationContext("bean6.xml");Orders orders context.getBean("factoryBean", Orders.class);System.out.println("第四部 获取创…

後は勉強をもっともっと頑張りましょう、自分の人生は自分で切り開くしかありません...

後は勉強をもっともっと頑張りましょう、自分の人生は自分で切り開くしかありません