好题。。

先找出每个节点的树上最长路

由树形DP完成

节点x,设其最长路的子节点为y

对于y的最长路,有向上和向下两种情况:

down:y向子节点的最长路g[y][0]

up:x的次长路的g[x][1]+dis[x][y]

up:up[fa[x]]+dis[x][y]

dfs1找向下,即向子节点的最长路

dfs2找向上的最长路

最后最长路f[i]=max(up[x],g[x][0])

第二部分

找最长连续子序列,使得序列中abs(mx-mn)<=m

这次学习了用单调队列的做法

两个队列mx,mn

mx存单减的f[i]的i,mn单增

由于差值不大于m

每次找出front的最小值出队就行了

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #include<queue>
 #define LL long long
 using namespace std;
 ;
 struct node{
     int to,next;
     LL cost;
 }e[maxn];
 int n,m,tot,x;
 LL g[maxn][],f[maxn],y,head[maxn];

 void insert(int u, int v, LL c){
     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; e[tot].cost=c;
 }

 #define v e[i].to
 void dfs1(int u){
     ; i=e[i].next){
         dfs1(v);
         ]<g[v][]+e[i].cost){
             g[u][]=max(g[u][],g[u][]);
             g[u][]=g[v][]+e[i].cost;
         }]=max(g[u][],g[v][]+e[i].cost);
     }
 }
 void dfs2(int u){
     ; i=e[i].next){
         f[v]=f[u]+e[i].cost;
         ]+e[i].cost==g[u][]) f[v]=max(f[v],g[u][]+e[i].cost);
         ]+e[i].cost);
         dfs2(v);
     }
 }

 int main(){
     scanf("%d%d", &n, &m);
     tot=; memset(head,-,sizeof(head));
     ; i<=n; i++){
         int x; LL y;
         scanf("%d%lld", &x, &y);
         insert(x,i,y);
     }
     dfs1();
     dfs2();
     ; i<=n; i++) f[i]=max(f[i],g[i][]);
     deque<int> mx,mn;
     ;
     ;
     ; i<=n; i++){
         while (!mx.empty() && f[mx.back()]<=f[i]) mx.pop_back();
         while (!mn.empty() && f[mn.back()]>=f[i]) mn.pop_back();
         mx.push_back(i); mn.push_back(i);
         while (f[mx.front()]-f[mn.front()]>m){
             if (mx.front()<mn.front()){
                 st=mx.front()+;
                 mx.pop_front();
             }
             else{
                 st=mn.front()+;
                 mn.pop_front();
             }
         }
         ans=max(ans,i-st+);
     }
     printf("%d\n", ans);
     ;
 }

bzoj2500: 幸福的道路(树形dp+单调队列)的更多相关文章

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

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

  2. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

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

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

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

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

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

  5. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

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

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

  7. Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...

  8. HDU 4123 Bob’s Race 树形dp+单调队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...

  9. POJ - 3162 Walking Race 树形dp 单调队列

    POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...

随机推荐

  1. 02OC的类和对象

    这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#.Java等没有那么多的语法特性,所以差别还是比较大的. 一 ...

  2. Android下如何计算两经纬点之间距离

    节选自百度地图API: 若开发者使用的是百度地图或定位API,且版本在1.3.5以后的, 路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法. 如果是计算任 ...

  3. poj 1192

    此题亦一眼看出算法,一次AC. 没什么好讲的,就是一个普通的树形动规. 用dp[n][0]表示n号顶点不取时的最大值,dp[n][1]表示n号顶点取时的最大值. dp[n][0]=max{dp[x][ ...

  4. C#夯实基础系列之字符串

    string作为我们在编程当中用的最多的数据类型,同时又由于它的特殊性,怎么强调它的重要性都不为过,理解string的一些类型和存储机制,有助于我们写出正确且高效的代码. 一.string类型 1.s ...

  5. 【Maven】运行项目

    1.run as maven clean 清除原有的编译结果重新编译一次. 2.run as maven bulid.. goals:package tomcat7:deploy 打包到Tomcat7 ...

  6. JQuery 自动触发事件

    JQuery 常用模拟 有时候,需要通过模拟用户操作,来达到单击的效果.例如在用户进入页面后,就触发click事件,而不需要用户去主动单击. 在JQuery中,可以使用trigger()方法完成模拟操 ...

  7. RobotFrameWork(六)控制流之For循环

    转自: http://blog.csdn.net/mengfanbo123/article/details/9033645 For循环 函数结构范例: :For 变量  IN  序列(or 列表) 关 ...

  8. java获得汉语首字母

    package org.scbit.lsbi.scp.utils; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefor ...

  9. HTTP状态码(2xx,3xx,4xx,5xx)

    HTTP状态码负责表示客户端请求的返回结果,标记服务器的处理结果. HTTP常用状态码分为5种:   类别 原因短语 1xx Informational(信息状态码) 接受请求正在处理 2xx Suc ...

  10. jdbc连接数据库(mysql,sqlserver,oracle)

    package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...