2500: 幸福的道路


Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 474  Solved: 194
[Submit][Status][Discuss]

Description


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

Input


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

Output


最长的连续锻炼天数

Sample Input

  1.  

Sample Output


  1.  

数据范围:


50%的数据N<=1000
80%的数据N<=100 000
100%的数据N<=1000 000
 

HINT


分析:


比较容易分析的题目。

求每个点的树上最远距离

后面的处理连续天数因为具有传递性是O(n)的。

用优先队列模拟出multiset,总复杂度O(nlogn)

AC代码:


  1. # include <iostream>
  2. # include <cstdio>
  3. # include <queue>
  4. using namespace std;
  5. typedef long long LL;
  6. const int N = 1e6 + ;
  7. int head[N],dt,n,mn[N],Log[];LL m,f1[N],f2[N],g[N];
  8. struct Edge{
  9. int to,nex;LL w;
  10. }edge[N];
  11. struct Heap{
  12. priority_queue<LL> A,B;
  13. void insert(LL x){A.push(x);}
  14. void erase(LL x){B.push(x);}
  15. void pop(){while(!B.empty() && A.top() == B.top())A.pop(),B.pop();}
  16. LL top(){pop();return A.top();}
  17. int size(){return A.size() - B.size();}
  18. }A,B;
  19. void AddEdge(int u,int v,LL w)
  20. {
  21. edge[++dt] = (Edge){v,head[u],w};
  22. head[u] = dt;
  23. }
  24. void dfs(int u)
  25. {
  26. f1[u] = f2[u] = ;
  27. for(int i = head[u];i;i = edge[i].nex)
  28. {
  29. dfs(edge[i].to);
  30. LL tmp = f1[edge[i].to] + edge[i].w;
  31. if(tmp >= f1[u])
  32. {
  33. f2[u] = f1[u];
  34. f1[u] = tmp;
  35. }
  36. else f2[u] = max(f2[u],tmp);
  37. }
  38. }
  39. void Dfs(int u)
  40. {
  41. for(int i = head[u];i;i = edge[i].nex)
  42. {
  43. if(f1[u] == f1[edge[i].to] + edge[i].w)
  44. g[edge[i].to] = max(f2[u],g[u]) + edge[i].w;
  45. else g[edge[i].to] = max(f1[u],g[u]) + edge[i].w;
  46. Dfs(edge[i].to);
  47. }
  48. }
  49. int main()
  50. {
  51. scanf("%d %lld",&n,&m);int x;LL y;
  52. for(int i = ;i <= n;i++)scanf("%d %lld",&x,&y),AddEdge(x,i,y);
  53. dfs();Dfs();
  54. for(int i = ;i <= n;i++)g[i] = max(g[i],f1[i]);
  55. A.insert(g[]);B.insert(-g[]);int r = ,ans = ;
  56. for(int i = ;i <= n;i++)
  57. {
  58. LL mi = r == i ? g[i] : -B.top(),mx = r == i ? g[i] : A.top();
  59. while(r <= n)
  60. {
  61. mx = max(mx,g[r]);
  62. mi = min(mi,g[r]);
  63. if(mx - mi <= m)A.insert(g[r]),B.insert(-g[r]),r++;
  64. else break;
  65. }
  66. A.erase(g[i]);B.erase(-g[i]);
  67. ans = max(ans,r - i);
  68. }
  69. printf("%d\n",ans);
  70. }

[Bzoj2500]幸福的道路(树上最远点)的更多相关文章

  1. BZOJ2500: 幸福的道路

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

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

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

  3. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

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

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

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

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

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

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

  7. [BZOJ 2500] 幸福的道路

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

  8. csu 1798(树上最远点对,线段树+lca)

    1798: 小Z的城市 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 60  Solved: 16[Submit][Status][Web Board] ...

  9. 【bzoj2500】幸福的道路 树形dp+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

随机推荐

  1. laravel如何查找门脸及注入类方法

    门脸模式 通过 config/app.php 查看别名对应类名 Illuminate\Support\Facades\Log ,查看 LoggerInterface 类文件,得:命名空间+接口名 Ps ...

  2. 【HEVC帧间预测论文】P1.1 基于运动特征的HEVC快速帧间预测算法

    基于运动特征的 HEVC 快速帧间预测算法/Fast Inter-Frame Prediction Algorithm for HEVC Based on Motion Features <HE ...

  3. 基于 python 的接口测试框架

    项目背景 公司内部的软件采用B/S架构,管理实验室数据,实现数据的存储和分析统计.大部分是数据的增删改查,由于还在开发阶段,所以UI界面的变化非常快,之前尝试过用python+selenium进行UI ...

  4. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页

    提升程序员工作效率的工具/技巧推荐系列 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理 ...

  5. javaee 第四周作业

    分析hello.java.下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 /** * Copyr ...

  6. JQQ文字素材

    1.十二生肖:子鼠.丑牛.寅虎.卯兔.辰龙.巳舍.午马.未羊.申猴.酉鸡.戌狗.亥猪.丙申年(2016)乙未年(2015)甲午年(2014)癸巳年(2013)壬辰年(2012)辛卯年(2011)庚寅年 ...

  7. execve - 执行程序

    总览 (SYNOPSIS) #include <unistd.h> int execve (const char *filename, char *const argv [], char ...

  8. flask学习规划

    实现基本登录注册: 留言板功能: 并且部署到服务器: 预计完成时间6.16:. 后续页面美化: 各种其他功能的探索一个月时间: 并行地学习python,java,css,html,js,sql 暑假预 ...

  9. nvm、npm、nodejs的关系(转载)

    nvm.npm.nodejs的关系 为什么要了解nvm.npm.nodejs的关系: reactNative的项目构建都是有这几个工具进行构建管理. 掌握他们的关系,就能了解reactNative项目 ...

  10. matlab 随笔

    <<matlab高级编程技巧与应用:45个案例分析>> 一. 重新认识向量化编程 1.向量化编程与循环的比较 2.预分配内存更好 3.matlab中是列优先 4.归一化 数据归 ...