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

所以先找出直径,求出最长路径,然后再求波动值<=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. solr研磨之游标分页

    普通分页 当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000 x 10 页的数据,并将这100000条数据缓存在内存中,然后在内存中进行排序.最后返回最后10 ...

  2. DB2常见问题

    15.1实例常见问题和诊断案例 1.实例无法启动问题 db2nodes.cfg文件,主要是为了数据库分区设计的.如果实例无法启动,要检查db2nodes.cfg,看配置是否正常.db2systm实例配 ...

  3. 公司内网搭建代理DNS使用内网域名代替ip地址

    企业场景 一般在企业内部,开发.测试以及预生产都会有一套供开发以及测试人员使用的网络环境.运维人员会为每套环境的相关项目配置单独的Tomcat,然后开放一个端口,以 IP+Port 的形式访问.然而随 ...

  4. Ueditor1.3.6 setContent的一个bug

    Baidu Uedtior这个版本的占位标签为script标签,UE.get("editor")操作初始化编辑器,这个初始化动作似乎是个异步动作,在这个语句之后如果setConte ...

  5. HDU-5738

    Eureka Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem D ...

  6. Lintcode397 Longest Increasing Continuous Subsequence solution 题解

    [题目描述] Give an integer array,find the longest increasing continuous subsequence in this array. An in ...

  7. Entity Framework分页扩展

    Entity Framework分页在我初入门时总是困扰这我,无论是SQL分页还是Entity Framework的分页,总是显得那么麻烦,因此对于Entity Framework单独封装了分页. 一 ...

  8. jdk和tomcat环境配置

    一.安装JDK和Tomcat 1,安装JDK:直接运行jdk-7-windows-i586.exe可执行程序,默认安装即可. 备注:路径可以其他盘符,不建议路径包含中文名及特殊符号. 2.安装Tomc ...

  9. Servlet线程

    一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组线程叫做工作者线程(Wor ...

  10. java 一维数组

    数组的概念?有什么特点? 数组是指一组数据的集合,数组中的每个数据被称作元素.在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致. 一维数组的定义格式? 数据类型[]   名称  = ...