首先明确:树上任意一点的最长路径一定是直径的某一端点。

所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<set>
#define N 1000005
using namespace std; int fa[N],cal[N],dis[2][N],d[N]; int e=1,head[N]; struct edge{
int u,v,w,next;
}ed[N]; void add(int u,int v,int w){
ed[e].u=u; ed[e].v=v; ed[e].w=w;
ed[e].next=head[u]; head[u]=e++;
} int L,R,it,maxn; bool bo[N]; void dfs(int x,int len){
bo[x]=1;
if(len>maxn) it=x,maxn=len;
if(!bo[fa[x]]) dfs(fa[x],len+cal[x]);
for(int i=head[x];i;i=ed[i].next){
if(!bo[ed[i].v])
dfs(ed[i].v,len+ed[i].w);
}
} int q[N],h,t; void bfs(int x,int wh){
bo[x]=1;int now,v,w; dis[wh][x]=0;
q[1]=x; h=t=1;
while(h<=t){
now=q[h++];
if(fa[now]&&!bo[fa[now]]&&dis[wh][fa[now]]<dis[wh][now]+cal[now]){
dis[wh][fa[now]]=dis[wh][now]+cal[now];
bo[fa[now]]=1; q[++t]=fa[now];
}
for(int i=head[now];i;i=ed[i].next){
v=ed[i].v; w=ed[i].w;
if(!bo[v]&&dis[wh][v]<dis[wh][now]+w){
dis[wh][v]=dis[wh][now]+w;
bo[v]=1; q[++t]=v;
}
}
}
} int n,m; int main()
{
//freopen("race.in","r",stdin);
//freopen("race.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++){
scanf("%d%d",&fa[i],&cal[i]);
add(fa[i],i,cal[i]);
}
maxn=0; memset(bo,0,sizeof bo); dfs(1,0); L=it;
maxn=0; memset(bo,0,sizeof bo); dfs(L,0); R=it;
memset(bo,0,sizeof bo); bfs(L,0);
memset(bo,0,sizeof bo); bfs(R,1);
for(int i=1;i<=n;i++) d[i]=max(dis[0][i],dis[1][i]); //printf("%0.2lf\n",(double)clock()/CLOCKS_PER_SEC); multiset<int > ss;
int dd,xx,ll=1,ans=0;
for(int i=1;i<=n;i++){
ss.insert(d[i]);
dd=*(--ss.end());
xx=*(ss.begin());
while(dd-xx>m)
ss.erase(ss.find(d[ll++])),dd=*(--ss.end()),xx=*(ss.begin());
ans=max(ans,i-ll+1);
} printf("%d\n",ans);
return 0;
}

然而我打的依旧很蠢。。QAQ

bzoj 2500 幸福的道路 树上直径+set的更多相关文章

  1. [BZOJ 2500] 幸福的道路

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

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

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

  3. ●BZOJ 2500 幸福的道路

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2500 题解: DFS,单调队列 首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个 ...

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

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

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

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

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

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

  7. BZOJ2500: 幸福的道路

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

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

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

  9. BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划

    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...

随机推荐

  1. CALayer简介

    一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. * 其实UIView之所以 ...

  2. DB2常用命令小结

    PS:执行命令前需要进入DB2的账户下:su db2inst1 修改密码:更改相应的操作系统密码即可,windows上可以更改db2admin的密码,linux上更改db2inst1的密码即可,db2 ...

  3. Spring AOP四种实现方式Demo详解与相关知识探究

    一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~ ...

  4. R实战 第七篇:网格(grid)

    grid包是R底层的图形系统,可以绘制几乎所有的图形.除了绘制图形之外,grid包还能对图形进行布局.在绘图时,有时候会遇到这样一种情景,客户想把多个代表不同KPI的图形分布到同一个画布(Page)上 ...

  5. Github Page 绑定域名

    http://kyle.xlau.org/posts/github-cname.html CNAME 创建一个CNAME文件,内容是你的域名,如: xlau.org 然后把此文件添加到Github仓库 ...

  6. Jenkins踩坑系列--你试过linux主机ssh登录windows,启动java进程吗,来试试吧

    一.问题概述 在一个多月前,组长让我研究下持续集成.我很自然地选择了jenkins.当时,(包括现在也是),部分服务器用的是windows主机. 我当时想了想,如果我把jenkins装在windows ...

  7. python之文件操作(基础)

    文件操作作为python基础中的重点,必须要掌握. 1.默认我们在本地电脑E盘新建wp.txt文件进行测试,文件内容如下设置. 2.进行代码编写: f=open("E://wp.txt&qu ...

  8. Docker 跨主机网络方案分析

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  9. Visual Studio 201~ Code 格式检查

    前言 好的代码格式,有利于阅读和查错,慢慢的有利于养成良好的编码习惯,也可以帮我们找出一些低级错误. StyleCop 在Nuget上搜索stylecop,选择MSBuild的那个版本,安装. 手动编 ...

  10. 使用DOS命令关闭tomcat端口(其他服务也是可以的)

    废话不多说,直接上步骤: WIN+R 打开DOS窗口 输入netstat -ano|findstr 8080(其中8080是我自己tomcat的端口号) 之后可以看到端口号的最后会有数字,这个数字是端 ...