题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2500

题解:

DFS,单调队列

首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个端点。

然后就3个DFS求出直接并得到D[i]数组表示i点到最远的点的距离。

然后就用两个单调队列分别维护一个单减的最大值和一个单增的最小值,

以便求出以i位置结尾的最长合法区间。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000500
#define rint register int
using namespace std;
struct Edge{
int to[MAXN*2],val[MAXN*2],nxt[MAXN*2],head[MAXN],ent;
Edge(){ent=2;}
void Adde(int &u,int &v,int &w){
to[ent]=v; val[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; val[ent]=w; nxt[ent]=head[v]; head[v]=ent++;
}
}E;
int D[MAXN];
int N,M,d1,d2,val;
char gc(){
//return getchar();
static char s[300005];
static int bit=300000,p=0,len=0;
if(p>=len) len=fread(s,1,bit,stdin),s[len]=EOF,p=0;
return s[p++];
}
void read(int &x){
static int sn; static char ch;
x=0; sn=1; ch=gc();
while(ch<'0'||'9'<ch){if(ch=='-')sn=-1;ch=gc();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=gc();}
x=x*sn;
}
void cmax(int &a,int b){
if(a<b) a=b;
}
void dfs(int u,int fa,int len,int &d){
if(len>=val) d=u,val=len;
cmax(D[u],len);
for(int i=E.head[u];i;i=E.nxt[i]){
if(E.to[i]==fa) continue;
dfs(E.to[i],u,len+E.val[i],d);
}
}
int solve(){
static int qmx[MAXN],qmn[MAXN],lmx=1,rmx=0,lmn=1,rmn=0,ANS=0,p=1;
for(int i=1;i<=N;i++){
while(lmx<=rmx&&D[qmx[rmx]]<=D[i]) rmx--;
while(lmn<=rmn&&D[qmn[rmn]]>=D[i]) rmn--;
qmx[++rmx]=i; qmn[++rmn]=i;
while(D[qmx[lmx]]-D[qmn[lmn]]>M){
if(qmx[lmx]<qmn[lmn]) p=qmx[lmx]+1,lmx++;
else p=qmn[lmn]+1,lmn++;
}
cmax(ANS,i-p+1);
}
return ANS;
}
int main(){
read(N); read(M);
for(rint i=2,f,d;i<=N;i++)
read(f),read(d),E.Adde(f,i,d);
val=0; dfs(1,0,0,d1);
val=0; dfs(d1,0,0,d2);
val=0; dfs(d2,0,0,d1);
printf("%d",solve());
return 0;
}

  

●BZOJ 2500 幸福的道路的更多相关文章

  1. [BZOJ 2500] 幸福的道路

    照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 145[Submit][Sta ...

  2. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

  3. bzoj 2500 幸福的道路 树上直径+set

    首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...

  4. BZOJ 2500 幸福的道路(race) 树上直径+平衡树

    structHeal { priority_queue<int> real; priority_queue<int> stack; void push(int x){ real ...

  5. 【BZOJ】【2500】幸福的道路

    树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...

  6. BZOJ2500: 幸福的道路

    题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...

  7. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss ...

  8. [Bzoj2500]幸福的道路(树上最远点)

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 474  Solved: 194[Submit][Status][Discuss ...

  9. 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法

    [BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...

随机推荐

  1. Archlinux下i3wm与urxvt的配置

    前段时间学习了GitHub的两位前辈:Airblader和wlh320.他们的相关教程在https://github.com/Airblader/i3和https://github.com/wlh32 ...

  2. spring mvc 整合Quartz

    Quartz是一个完全由java编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!Quartz整合在sp ...

  3. Linux下vim上编辑实现进度条

    1.效果展示: 进度条,先来看一个效果: 这是进度结果,模拟实现了进度条的前进.百分比的现实.以及稍微的动画特效. 2.原理描述: 因为Linux系统下的输出有缓存,如果及时刷新显示,就可以得到我们想 ...

  4. iOS开发所有KeyboardType与图片对应展示

    1.UIKeyboardTypeAlphabet 2.UIKeyboardTypeASCIICapable 3.UIKeyboardTypeDecimalPad  4.UIKeyboardTypeDe ...

  5. Android Notification setLatestEventInfo方法已废弃

    代替setLatestEventInfo的方法是用Notification.Builder创建Builder对象,通过该对象设置Notification相关属性. otification.Builde ...

  6. 数据恢复案例分享:MSSQL 2000 错误823

    一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...

  7. C#网页提交html代码报错

    1.在页面顶部 Page 标签加入属性 ValidateRequest="false" 2.如果开发环境是4.0及以上,在web.config加入 <system.web&g ...

  8. Node入门教程(2)第一章:NodeJS 概述

    Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  9. JS的if和switch

    var aa=parseInt(prompt("请输入你的年龄")); //定义输入 if(aa<18){ //输出小于18,返回值少年 alert("少年&quo ...

  10. centos虚拟机nat模式,可以上内网,不能上外网

    http://sky425509.iteye.com/blog/1996085 我这边的问题是,好久没用虚拟机了,重启之后,变成了dhcp模式,整个网卡配置变了. 重新配置了静态ip,网关,dns后才 ...