[Bzoj2500]幸福的道路(树上最远点)
2500: 幸福的道路
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 474 Solved: 194
[Submit][Status][Discuss]
Description
Input
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]幸福的道路(树上最远点)的更多相关文章
- BZOJ2500: 幸福的道路
题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- bzoj 2500 幸福的道路 树上直径+set
首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- 【BZOJ】【2500】幸福的道路
树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...
- [BZOJ 2500] 幸福的道路
照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 368 Solved: 145[Submit][Sta ...
- csu 1798(树上最远点对,线段树+lca)
1798: 小Z的城市 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 60 Solved: 16[Submit][Status][Web Board] ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
随机推荐
- mac下安装nodejs
下载 https://nodejs.org/en/ 安装 一步步继续就ok 验证 npm -v node -v Done!
- 你的项目刚刚启动?是时候考虑Globalization了!
今天继续由SAP成都研究院非典型程序猿, 菜园子小哥王聪给大家带来分享. 关于这个很长的定语的由来,请参考这篇文章,里面有王聪的背景介绍,包括他种菜的特长:当我用UI5诊断工具时我用些什么. 秋天到了 ...
- TebsorFlow低阶API(五)—— 保存和恢复
简介 tf.train.Saver 类提供了保存和恢复模型的方法.通过 tf.saved_model.simple_save 函数可以轻松地保存适合投入使用的模型.Estimator会自动保存和恢复 ...
- 环球影城母公司:务必阻止复仇者和 X 战警团聚
今日导读 去年 12 月,迪士尼宣布收购 21 世纪福克斯后,许多漫威粉丝们马上欢呼:复仇者终于可以和 X 战警团聚了!然而,超级英雄大团圆这个美好景象恐怕不会那么容易实现.就在近日,环球影城母公司— ...
- 线程的start和run方法的区别
回到这个问题,可以用源码的角度去回答,这样会让面试官对有更好的印象 ------>如果直接调用run方法的话,所执行的线程是main线程.调用start方法的话,会新建一个子线程,去执行run方 ...
- ios字体简单设定
UILabel *lable = [[UILabel alloc] init]; label.font = [];
- vue 中scroll事件不触发问题
在vue项目中需要监听滚动条滚动的位置,结果写了scroll监听事件就是不生效,最后查资料发现是页面有样式设置了over-flow:scroll,去掉之后完美解决.(页面样式中存在over-flow: ...
- (9) openssl enc(对称加密)
对称加密工具,了解对称加密的原理后就很简单了,原理部分见下文. openssl enc -ciphername [-in filename] [-out filename] [-pa ...
- ubuntu mysql配置方案
Ubuntu常用服务器环境搭建--MySQL篇 MySQL 1.安装MySQL apt-get update apt-get install mysql-server 2.配置MySQL vi /et ...
- Java中线程的使用
多线程的创建及启动 一.继承Thread类创建线程子类 1.在这子类中重写run方法,在run方法内写线程任务代码 2.创建该子类实例,即是创建了一个线程实例 3.调用该实例的start方法来启动该线 ...