【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
【BZOJ2500】幸福的道路
Description
Input
Output
Sample Input
1 1
1 3
Sample Output
数据范围:
50%的数据N<=1000
80%的数据N<=100 000
100%的数据N<=1000 000
题解:这题显然可以被分成两个子任务
1.求树上距离点i最远的点到i的距离
方法:维护每个点子树中到这个点距离的最大值和次大值,然后搞一搞~
2.求最长的一段区间,使得区间中最大值和最小值的差≤M
方法:先用RMQ求出区间最大值最小值,然后上双指针法
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=1000010;
int n,m,cnt,l,r,ans;
int fa[maxn],to[maxn<<1],next[maxn<<1],head[maxn];
int d1[maxn],d2[maxn],q[maxn],from[maxn];
int Log[maxn],dm[maxn][20],dn[maxn][20];
void updata(int x,int tmp)
{
if(d1[x]<tmp) d2[x]=d1[x],d1[x]=tmp;
else d2[x]=max(d2[x],tmp);
}
void dfs1(int x)
{
int i,tmp;
q[++q[0]]=x;
for(i=head[x];i!=-1;i=next[i])
dfs1(to[i]),updata(x,d1[to[i]]+from[to[i]]);
}
void add(int a,int b)
{
to[cnt]=b;
next[cnt]=head[a];
head[a]=cnt++;
}
int gm(int a,int b)
{
int k=Log[b-a+1];
return max(dm[a][k],dm[b-(1<<k)+1][k]);
}
int gn(int a,int b)
{
int k=Log[b-a+1];
return min(dn[a][k],dn[b-(1<<k)+1][k]);
}
int main()
{
scanf("%d%d",&n,&m);
int i,j,a,b,c;
memset(head,-1,sizeof(head));
for(i=2;i<=n;i++)
{
scanf("%d%d",&fa[i],&from[i]);
add(fa[i],i);
}
dfs1(1);
for(i=2;i<=n;i++)
{
if(d1[fa[q[i]]]==d1[q[i]]+from[q[i]]) updata(q[i],d2[fa[q[i]]]+from[q[i]]);
else updata(q[i],d1[fa[q[i]]]+from[q[i]]);
}
for(i=1;i<=n;i++) dm[i][0]=dn[i][0]=d1[i];
for(i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for(j=1;(1<<j)<=n;j++)
{
for(i=1;i+(1<<j)-1<=n;i++)
{
dm[i][j]=max(dm[i][j-1],dm[i+(1<<j-1)][j-1]);
dn[i][j]=min(dn[i][j-1],dn[i+(1<<j-1)][j-1]);
}
}
int h=1;
ans=-1;
for(i=1;i<=n;i++)
{
while(gm(h,i)-gn(h,i)>m) h++;
ans=max(ans,i-h+1);
}
printf("%d",ans);
return 0;
}
【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法的更多相关文章
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- 重建道路 树形DP
重建道路 树形DP 给一棵树,问最少断多少边使得这棵树树最终只有\(p\)个节点 设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离 ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- BZOJ2500: 幸福的道路
题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...
随机推荐
- 使用TestFlight邀请外部人员測试APP
怎样使用TestFlight邀请外部人员測试APP 详细过程例如以下: 1.在邀请測试人员的时候.按上线流程打包APP,提交. 2.提交审核,在邀请測试员的时候,你必须先提交审核,苹果会在大约2个工作 ...
- Django的ORM中如何判断查询结果是否为空,判断django中的orm为空
result= Booking.objects.filter() #方法一 .exists() if result.exists(): print "QuerySet has Data&qu ...
- 简单的并发测试工具 ab.exe ab.zip可下载 -摘自网络
ab.exe是一个性能检测工具,是apache server中的一个小组件,使用简单,方便 下载地址:http://files.cnblogs.com/files/gossip/ab.zip ...
- Informix 語法
1.修改表名稱 RENAME TABLE old_table_name TO new_table_name; 2.分頁 select SKIP 0 FIRST 1 * from tablename ...
- bash的输出多行和vim的全部选择
使用cat命令加输出符>来在bash脚本里面输出多行文本是最直观的做法. cat >out.file <<EOF start a line ... ... a line aga ...
- sql server 列修改null 变成not null
ALTER TABLE [table_name] ALTER COLUMN [column_name] [datetime] NOT NULL --datetime是列的类型
- layoutSubviews什么时候触发调用
ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ——————- - (void)layoutSubview ...
- Linux(Ubuntu/Debian/CentOS/RedHat)下交叉编译boost库
我用的软件版本如下(其他版本编译方法与此完全相同): Boost Ver: 1.55.0Compiler : GNU gcc 4.6 for ARM 1. 确保ARM编译成功安装,并配置好环境变量.2 ...
- django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
- systemd启动多实例
最近用了centos7,启动管理器用的是systemd,感觉很好玩. 1.开机自动启动 新建一个service文件放到/usr/lib/systemd/system/ 比如: [Unit] Descr ...