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

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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<ctime>
  7. #include<set>
  8. #define N 1000005
  9. using namespace std;
  10.  
  11. int fa[N],cal[N],dis[2][N],d[N];
  12.  
  13. int e=1,head[N];
  14.  
  15. struct edge{
  16. int u,v,w,next;
  17. }ed[N];
  18.  
  19. void add(int u,int v,int w){
  20. ed[e].u=u; ed[e].v=v; ed[e].w=w;
  21. ed[e].next=head[u]; head[u]=e++;
  22. }
  23.  
  24. int L,R,it,maxn;
  25.  
  26. bool bo[N];
  27.  
  28. void dfs(int x,int len){
  29. bo[x]=1;
  30. if(len>maxn) it=x,maxn=len;
  31. if(!bo[fa[x]]) dfs(fa[x],len+cal[x]);
  32. for(int i=head[x];i;i=ed[i].next){
  33. if(!bo[ed[i].v])
  34. dfs(ed[i].v,len+ed[i].w);
  35. }
  36. }
  37.  
  38. int q[N],h,t;
  39.  
  40. void bfs(int x,int wh){
  41. bo[x]=1;int now,v,w; dis[wh][x]=0;
  42. q[1]=x; h=t=1;
  43. while(h<=t){
  44. now=q[h++];
  45. if(fa[now]&&!bo[fa[now]]&&dis[wh][fa[now]]<dis[wh][now]+cal[now]){
  46. dis[wh][fa[now]]=dis[wh][now]+cal[now];
  47. bo[fa[now]]=1; q[++t]=fa[now];
  48. }
  49. for(int i=head[now];i;i=ed[i].next){
  50. v=ed[i].v; w=ed[i].w;
  51. if(!bo[v]&&dis[wh][v]<dis[wh][now]+w){
  52. dis[wh][v]=dis[wh][now]+w;
  53. bo[v]=1; q[++t]=v;
  54. }
  55. }
  56. }
  57. }
  58.  
  59. int n,m;
  60.  
  61. int main()
  62. {
  63. //freopen("race.in","r",stdin);
  64. //freopen("race.out","w",stdout);
  65. scanf("%d%d",&n,&m);
  66. for(int i=2;i<=n;i++){
  67. scanf("%d%d",&fa[i],&cal[i]);
  68. add(fa[i],i,cal[i]);
  69. }
  70. maxn=0; memset(bo,0,sizeof bo); dfs(1,0); L=it;
  71. maxn=0; memset(bo,0,sizeof bo); dfs(L,0); R=it;
  72. memset(bo,0,sizeof bo); bfs(L,0);
  73. memset(bo,0,sizeof bo); bfs(R,1);
  74. for(int i=1;i<=n;i++) d[i]=max(dis[0][i],dis[1][i]);
  75.  
  76. //printf("%0.2lf\n",(double)clock()/CLOCKS_PER_SEC);
  77.  
  78. multiset<int > ss;
  79. int dd,xx,ll=1,ans=0;
  80. for(int i=1;i<=n;i++){
  81. ss.insert(d[i]);
  82. dd=*(--ss.end());
  83. xx=*(ss.begin());
  84. while(dd-xx>m)
  85. ss.erase(ss.find(d[ll++])),dd=*(--ss.end()),xx=*(ss.begin());
  86. ans=max(ans,i-ll+1);
  87. }
  88.  
  89. printf("%d\n",ans);
  90. return 0;
  91. }

然而我打的依旧很蠢。。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. mysql6.5 操作日志

    创建用户并授权 grant all privileges on database.* to user@localhost identified by '123456'; flush privilege ...

  2. Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)

    根据中序和后续遍历构建二叉树. /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree ...

  3. Java的运行原理

    在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口.编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由 ...

  4. Day24 中间件 自定义分页 ModelForm 序列化 缓存 信号

    在views里边,怎么导入局部配置和全局配置 from s18day24 import settings #这样导入的是仅仅用户自定义的配置 from django.conf import setti ...

  5. LAMP的搭建

    可以在网上找整合包: httpd-2.4.18 + mysql-5.6.29 + php-5.5.30编译安装过程: 编译源代码后安装软件的位置:/usr/local/ 一.编译安装apache ap ...

  6. 重装完的win10卡“请稍等”,然后电脑不断自动重启还是卡在“请稍等”?

    http://bbs.pcbeta.com/viewthread-1625778-1-1.html 说实话我用U盘安装win10遇到过几次这种情况,不管是win10正式版还是之前的个别win10测试版 ...

  7. 第一次作业 orm环境构建(hibernate)及基本的demo

    一.数据库 1.创建数据库hibernate01-1514010311 2.创建表 customer CREATE TABLE customer( id int(11) not null auto_i ...

  8. 《Linux下FTP服务器搭建及FTP使用》

    .LOGAndy:mxtd114 <Linux下FTP服务器搭建> 0.root登录 1.安装ftp # yum -y install ftp 2.安装vsftpd # yum -y in ...

  9. 简单而强大的bitset

    简单而强大的bitset 介绍 有些程序需要处理二进制有序集,标准库提供了bitset 类型,事实上,bitset 是一个二进制容器,容器中每一个元素都是一位二进制码,或为 0,或为 1. 基础 bi ...

  10. 深度学习之 TensorFlow(四):卷积神经网络

    基础概念: 卷积神经网络(CNN):属于人工神经网络的一种,它的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量.卷积神经网络不像传统的识别算法一样,需要对数据进行特征提取和数据重建,可以直 ...