题目大概是给一棵n个结点边带权的树,记结点i到其他结点最远距离为d[i],问d数组构成的这个序列中满足其中最大值与最小值的差不超过m的连续子序列最长是多长。

各个结点到其他结点的最远距离可以用树形DP解决,HDU2196

而那个最长的连续子序列可以用单调队列求。。搞了挺久看了解法体会了下。。简单来说就是尺取法,用两个指针[i,j]表示区间,j不停+1往前移动,然后用两个单调队列分别同时更新区间最小值和最大值,再看两个队列队首的最值差是否大于m,是的话出队并调整i值,最后用j-i+1更新答案。

当然尺取法+RMQ也是OK的。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1LL<<60)
#define MAXN 1000111
struct Edge{
int v,w,next;
}edge[MAXN];
int NE,head[MAXN];
void addEdge(int u,int v,int w){
edge[NE].v=v; edge[NE].w=w; edge[NE].next=head[u];
head[u]=NE++;
}
int idx[MAXN];
long long d[][MAXN];
void dp0(int u){
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
dp0(v);
if(d[][u]<=d[][v]+edge[i].w){
d[][u]=d[][u];
d[][u]=d[][v]+edge[i].w;
idx[u]=v;
}else if(d[][u]<d[][v]+edge[i].w){
d[][u]=d[][v]+edge[i].w;
}else if(d[][u]<d[][v]+edge[i].w){
d[][u]=d[][v]+edge[i].w;
}
}
}
void dp1(int u){
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
if(idx[u]==v) d[][v]=max(d[][u],d[][u])+edge[i].w;
else d[][v]=max(d[][u],d[][u])+edge[i].w;
dp1(v);
}
}
struct Que{
int que[MAXN],front,rear;
bool isEmpty(){
return front==rear;
}
int getFront(){
return que[front];
}
int getRear(){
return que[rear-];
}
void push(int a){
que[rear++]=a;
}
}mxq,mmq;
int main(){
memset(head,-,sizeof(head));
int n,m,a,b;
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i){
scanf("%d%d",&a,&b);
addEdge(a,i,b);
}
dp0();
dp1();
int res=;
for(int i=,j=; i<=n; ++i){
d[][i]=max(d[][i],d[][i]);
while(!mxq.isEmpty() && d[][mxq.getRear()]<d[][i]) --mxq.rear;
mxq.push(i);
while(!mmq.isEmpty() && d[][mmq.getRear()]>d[][i]) --mmq.rear;
mmq.push(i);
while(d[][mxq.getFront()]-d[][mmq.getFront()]>m){
if(mxq.getFront()<mmq.getFront()) j=mxq.getFront()+,++mxq.front;
else j=mmq.getFront()+,++mmq.front;
}
res=max(res,i-j+);
}
printf("%d",res);
return ;
}

POJ3162 Walking Race(树形DP+尺取法+单调队列)的更多相关文章

  1. 【POJ3162】Walking Race 树形dp+单调队列+双指针

    题目大意:给定一棵 N 个节点的无根树,边有边权,现生成一个序列 d,d[i] 表示 i 号节点到树上其他节点距离的最大值.给定一个 m,求 d 序列中最大值和最小值之差不超过 m 的最长连续段的长度 ...

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

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

  3. [POJ3162]Walking Race(DP + 单调队列)

    传送门 题意:一棵n个节点的树.wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离 ...

  4. 【题解】poj 3162 Walking Race 树形dp

    题目描述 Walking RaceTime Limit: 10000MS Memory Limit: 131072KTotal Submissions: 4941 Accepted: 1252Case ...

  5. POJ 3162 Walking Race 树形DP+线段树

    给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...

  6. POJ 3162.Walking Race 树形dp 树的直径

    Walking Race Time Limit: 10000MS   Memory Limit: 131072K Total Submissions: 4123   Accepted: 1029 Ca ...

  7. 【BZOJ2282】[Sdoi2011]消防 树形DP+双指针法+单调队列

    [BZOJ2282][Sdoi2011]消防 Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这 ...

  8. POJ 3162 Walking Race 树形dp 优先队列

    http://poj.org/problem?id=3162 题意 :  一棵n个节点的树.wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要 ...

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

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

随机推荐

  1. cocos基础教程(11)事件分发机制

    cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...

  2. [Effective JavaScript 笔记]第22条:使用arguments创建可变参数的函数

    第21条讲述使用可变参数的函数average.该函数可处理任意数量的参数并返回这些参数的平均值. 如何创建可变参数的函数 1.实现固定元数的函数 书上的版本 function averageOfArr ...

  3. git参考资料

    个人博客 http://www.iwangzheng.com/ $git log --graph $git reset --hard 67889898... $ssh-add $git pull -- ...

  4. SIFT+HOG+鲁棒统计+RANSAC

    今天的计算机视觉课老师讲了不少内容,不过都是大概讲了下,我先记录下,细讲等以后再补充. SIFT特征: 尺度不变性:用不同参数的高斯函数作用于图像(相当于对图像进行模糊,得到不同尺度的图像),用得到的 ...

  5. poj1182(食物链)续

    意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用 ...

  6. MySQL Profiling 的使用

    MySQL Profiling 的使用 在本章第一节中我们还提到过通过 Query Profiler 来定位一条 Query 的性能瓶颈,这里我们再详细介绍一下 Profiling 的用途及使用方法. ...

  7. JAVA程序1,1,2,3,5,8,13,21....第30个是什么...?

    解题思路:从第3个数字开始,后一个数字是前2个数字的和public class text{ public static void main(String[] args) { int num1=1,nu ...

  8. 【系统】CentOS、Ubuntu、Debian三个linux比较异同

    CentOS.Ubuntu.Debian三个linux比较异同 2014-07-31 12:58             53428人阅读             评论(6)             ...

  9. 编译 uImage

    编译 uImage 和测试 u-Boot - 小猪爱拱地 - 博客频道 - CSDN.NET http://blog.csdn.net/caspiansea/article/details/38057 ...

  10. PHP 调试用函数

    2014年7月4日 10:27:59 有些系统函数可以在调试程序时救急用: get_class_methods(); get_class_vars(); get_object_vars(); get_ ...