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


Sample Output



数据范围:


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

HINT


分析:


比较容易分析的题目。

求每个点的树上最远距离

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

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

AC代码:


# include <iostream>
# include <cstdio>
# include <queue>
using namespace std;
typedef long long LL;
const int N = 1e6 + ;
int head[N],dt,n,mn[N],Log[];LL m,f1[N],f2[N],g[N];
struct Edge{
int to,nex;LL w;
}edge[N];
struct Heap{
priority_queue<LL> A,B;
void insert(LL x){A.push(x);}
void erase(LL x){B.push(x);}
void pop(){while(!B.empty() && A.top() == B.top())A.pop(),B.pop();}
LL top(){pop();return A.top();}
int size(){return A.size() - B.size();}
}A,B;
void AddEdge(int u,int v,LL w)
{
edge[++dt] = (Edge){v,head[u],w};
head[u] = dt;
}
void dfs(int u)
{
f1[u] = f2[u] = ;
for(int i = head[u];i;i = edge[i].nex)
{
dfs(edge[i].to);
LL tmp = f1[edge[i].to] + edge[i].w;
if(tmp >= f1[u])
{
f2[u] = f1[u];
f1[u] = tmp;
}
else f2[u] = max(f2[u],tmp);
}
}
void Dfs(int u)
{
for(int i = head[u];i;i = edge[i].nex)
{
if(f1[u] == f1[edge[i].to] + edge[i].w)
g[edge[i].to] = max(f2[u],g[u]) + edge[i].w;
else g[edge[i].to] = max(f1[u],g[u]) + edge[i].w;
Dfs(edge[i].to);
}
}
int main()
{
scanf("%d %lld",&n,&m);int x;LL y;
for(int i = ;i <= n;i++)scanf("%d %lld",&x,&y),AddEdge(x,i,y);
dfs();Dfs();
for(int i = ;i <= n;i++)g[i] = max(g[i],f1[i]);
A.insert(g[]);B.insert(-g[]);int r = ,ans = ;
for(int i = ;i <= n;i++)
{
LL mi = r == i ? g[i] : -B.top(),mx = r == i ? g[i] : A.top();
while(r <= n)
{
mx = max(mx,g[r]);
mi = min(mi,g[r]);
if(mx - mi <= m)A.insert(g[r]),B.insert(-g[r]),r++;
else break;
}
A.erase(g[i]);B.erase(-g[i]);
ans = max(ans,r - i);
}
printf("%d\n",ans);
}

[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. 洛谷 P1361 小猫爬山

    题目描述 WD和LHX饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. WD和LHX只好花钱让它们坐索道下山.索道上的缆车最大承重量为W ...

  2. Elasticsearch插件清单

    1.API插件:主要对Elasticsearch添加的API特性或者功能,通常用于搜索或者映射 2. 报警插件: 当Elasticsearch的索引指标超过阀值时就会触发 3. 分词插件:ik是比较好 ...

  3. Linux OpenGL 实践篇-11-shadow

    OpenGL 阴影 在三维场景中,为了使场景看起来更加的真实,通常需要为其添加阴影,OpenGL可以使用很多种技术实现阴影,其中有一种非常经典的实现是使用一种叫阴影贴图的实现,在本节中我们将使用阴影贴 ...

  4. 闲着蛋疼没事干,写个Mac端的Kcptun Client管理器

    原理: 执行一行脚本 输入服务器地址,端口,密码等做了图形化编辑 可以控制Kcptun是否正在运行 App已上传github https://github.com/nicky2k8/KcptunCli ...

  5. docker 新手入门(docker的安装)

    docker的安装(在centos7下面) 1. 卸载在liunx下,先看有没有安装docker,docker version,如果有的话,可以先移除 yum remove ........ 可以使用 ...

  6. JavaScript Html2canvas 生成高清图片(移动端模糊问题)

    最近在做一个移动端的项目,简单记录一下该功能. 需求是这样的: 将带有二维码和一些介绍信息 动态生成一张图片 比如说是 生成这样的图片,文字.主图.价格.二维码都是不固定的. 对于这个需求,看见微信上 ...

  7. 深度剖析 MySQL 事务隔离

    概述 今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别. 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修 ...

  8. vscode setting.json

    setting.json { "sync.gist": "#github的码##", "sync.lastUpload": "20 ...

  9. C-基础:C语言为什么不做数组下标越界检查

    //这段代码运行有可能不报错.]; ;i<;i++) { a[i]=i; } 1.为了提高运行效率,不检查数组下表越界,程序就可以跑得快.因为C语言并不是一个快速开发语言,它要求开发人员保证所有 ...

  10. github下拉刷新与上拉加载地址

    https://github.com/chrisbanes/Android-PullToRefresh