【bzoj2500】幸福的道路 树形dp+单调队列
Description
小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光.
他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图.
他们不愿枯燥的每天从同一个地方开始他们的锻炼,所以他们准备给起点标号后顺序地从每个起点开始(第一天从起点一开始,第二天从起点二开始……). 而且他们给每条道路定上一个幸福的值.很显然他们每次出发都想走幸福值和最长的路线(即从起点到树上的某一点路径中最长的一条).
他们不愿再经历之前的大起大落,所以决定连续几天的幸福值波动不能超过M(即一段连续的区间并且区间的最大值最小值之差不超过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
数据范围:
50%的数据N<=1000
80%的数据N<=100 000
100%的数据N<=1000 000
Sol
第一问,每个点能到达的最长链无非就是要么往子树走,要么往父亲走再往上走,那么我们用\(u[i]\)和\(d[i]\)分别表示向上走和向下走的最长链,向下走的直接dfs即可,向上走的我们更新x的儿子的dp值的时候,我们记录x儿子中\(d[i]\)的最大值和次大值,如果这个儿子不是最大值,那么用最大值更新,否则用次大值更新。记得x儿子的初值是\(u[x]\)。
第二问我们开俩单调队列,维护递减的最大值和递增的最小值,加入一个元素的时候按照正常操作更新队列,之后我们要从队首弹出元素直到两者之差小于等于m,弹出队列的过程就是哪边更靠左,就把哪边弹出,然后维护一个pos表示答案能够延伸到的左端点,每次弹出的时候更新为\(q[l1/l2]+1\)。这样经过若干次迭代之后就能找到合法的最靠左的pos,然后用\(i-pos+1\)更新答案。
当然这题的范围是允许st表的,偷懒写st表也可以(模拟赛内存砍了一半所以写不了qwq)
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct nod{int t;ll v;nod(int t=0,ll v=0):t(t),v(v){}};
vector<nod>e[1000005];
int n,x,q1[1000005],q2[1000005],l1=1,l2=1,r1,r2,g=1,ans;
ll m,y,u[1000005],d[1000005],a[1000005];
void dfs1(int x,int F){for(int i=0,t;i<e[x].size();i++)if((t=e[x][i].t)!=F)dfs1(t,x),d[x]=max(d[x],d[t]+e[x][i].v);}
void dfs2(int x,int F)
{
ll fm=0,sm=0;
for(int i=0,t;i<e[x].size();i++) if((t=e[x][i].t)!=F)
{
if(d[t]+e[x][i].v>fm) sm=fm,fm=d[t]+e[x][i].v;
else sm=max(sm,d[t]+e[x][i].v);
u[t]=u[x]+e[x][i].v;
}
for(int i=0,t;i<e[x].size();i++) if((t=e[x][i].t)!=F)
{
if(d[t]+e[x][i].v==fm) u[t]=max(u[t],sm+e[x][i].v);
else u[t]=max(u[t],fm+e[x][i].v);
dfs2(t,x);
}
}
int main()
{
scanf("%d%lld",&n,&m);
for(int i=2;i<=n;i++) scanf("%d%lld",&x,&y),e[i].push_back(nod(x,y)),e[x].push_back(nod(i,y));
dfs1(1,0);dfs2(1,0);
for(int i=1;i<=n;i++) a[i]=max(u[i],d[i]);
for(int i=1;i<=n;i++)
{
while(l1<=r1&&a[i]<=a[q1[r1]]) r1--;
while(l2<=r2&&a[i]>=a[q2[r2]]) r2--;
q1[++r1]=i;q2[++r2]=i;
while(a[q2[l2]]-a[q1[l1]]>m) if(q2[l2]<q1[l1]) g=q2[l2]+1,l2++;else g=q1[l1]+1,l1++;
ans=max(ans,i-g+1);
}
printf("%d\n",ans);
}
【bzoj2500】幸福的道路 树形dp+单调队列的更多相关文章
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...
- HDU 4123 Bob’s Race 树形dp+单调队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
- POJ - 3162 Walking Race 树形dp 单调队列
POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...
随机推荐
- 本人编写的一份前端vue面试题
说明,此题目本人自出,做过本人所在公司的前端面试题,在此共享给大家 1. 如何在vue组件中实现v-model的功能?(只需给出关键代码) 2. 简述你知道的生命周期函数和执行时机 3. 谈谈你对计算 ...
- Python字符串笔录
python字符串操作实方法,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等 1.去空格及特殊符号 >>> s = '123 ...
- Java微信公众平台开发(十四)【番外篇】--微信web开发者工具使用
转自:http://www.cuiyongzhi.com/post/58.html 为帮助开发者更方便.更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具.它是一个桌面应用,通过模拟微信 ...
- easyui之datagrid之formatter(后台传递常量自动转换值)
1,datagrid之formatter formatter格式化函数有三个参数: value:字段值(一般为后台传递给前台的值): row:当前行数据: index:当前行索引. return值是显 ...
- Linux下安装Python2.7
Linux下安装Python2.7 CentOS6.8 中默认安装了Python2.6,但是很多应用需要使用Python2.7,于是要学会如何在Linux下安装Python2.7,这里记录一下,免得以 ...
- SQL和NoSQL
SQL和NoSQL 目前的数据库系统非常多,有传统的关系型的数据库系统(又被称为SQL数据库系统),有最近几年流行起来的NoSQL数据库系统.其中NoSQL数据库系统又分为很多种不同的类型,根据各个系 ...
- pyspider用PyQuery解析页面数据
示例说明: 本示例主要是PyQuery解析返回的response页面数据.response.doc解析页面数据是pyspider的主要用法,应该熟练掌握基本使用方法.其他返回类型示例见后续文章. py ...
- JS 页面刷新或重载
一.先来看一个简单的例子:下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做.frame.html 由上(top.html)下(bottom.h ...
- Select2 的使用
实现这个下拉列表框 下载这两个官网上的CSS,JS 官网地址 https://select2.org/getting-started/installation 我自己存的高速下载地址 http://y ...
- selenium2 断言失败自动截图 (四)
一般web应用程序出错过后,会抛出异常.这个时候能截个图下来,当然是极好的. selenium自带了截图功能. //获取截图file File scrFile= ((TakesScreenshot)d ...