HDU 4123 Bob's Race:树的直径 + 单调队列 + st表
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123
题意:
给你一棵树,n个节点,每条边有长度。
然后有m个询问,每个询问给定一个q值。
设dis[i]为:从节点i出发,不重复经过节点,所能够走的最远距离。
每次询问问你:区间[l,r]最长能有多长,同时保证 max{dis[i]} - min{dis[i]} <= q (i∈[l,r])
题解:
首先有一个结论:
从树上的任意一个节点出发,尽可能往远走,最终一定会到达树的直径的两个端点之一。
所以先两遍dfs1,找出直径的两个端点。
然后分别从两个端点dfs2,求出所有节点的dis[i]。
因为节点必须选编号连续的一段区间,所以可以用到单调队列。
枚举每个节点i加入队首。
然后对于每个i,不断地丢掉队尾pos++,直到当前的区间[pos,i]符合条件。
那么每次都需要判断是否有 max{dis[i]} - min{dis[i]} <= q (i∈[pos,i])
这就要用到st表了,然后O(1)判断就好。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 50005
#define MAX_K 20 using namespace std; struct Edge
{
int dest;
int len;
Edge(int _dest,int _len)
{
dest=_dest;
len=_len;
}
Edge(){}
}; int n,m;
int maxd;
int st,ed;
int dis[MAX_N];
int lg[MAX_N];
int maxt[MAX_N][MAX_K];
int mint[MAX_N][MAX_K];
vector<Edge> edge[MAX_N]; void read()
{
for(int i=;i<=n;i++) edge[i].clear();
int x,y,z;
for(int i=;i<n;i++)
{
cin>>x>>y>>z;
edge[x].push_back(Edge(y,z));
edge[y].push_back(Edge(x,z));
}
} void dfs1(int now,int p,int d,int &v)
{
if(d>maxd)
{
maxd=d;
v=now;
}
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dest!=p) dfs1(temp.dest,now,d+temp.len,v);
}
} void dfs2(int now,int p,int d)
{
dis[now]=max(dis[now],d);
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dest!=p) dfs2(temp.dest,now,d+temp.len);
}
} void init_st()
{
lg[]=-;
for(int i=;i<=n;i++)
{
lg[i]=lg[i>>]+;
maxt[i][]=mint[i][]=dis[i];
}
for(int k=;(<<k)<=n;k++)
{
for(int i=;i+(<<k)-<=n;i++)
{
maxt[i][k]=max(maxt[i][k-],maxt[i+(<<(k-))][k-]);
mint[i][k]=min(mint[i][k-],mint[i+(<<(k-))][k-]);
}
}
} int query_max(int l,int r)
{
int k=lg[r-l+];
return max(maxt[l][k],maxt[r-(<<k)+][k]);
} int query_min(int l,int r)
{
int k=lg[r-l+];
return min(mint[l][k],mint[r-(<<k)+][k]);
} void work()
{
maxd=-;
dfs1(,-,,st);
maxd=-;
dfs1(st,-,,ed);
memset(dis,-,sizeof(dis));
dfs2(st,-,);
dfs2(ed,-,);
init_st();
while(m--)
{
int q;
cin>>q;
int ans=;
int pos=;
for(int i=;i<=n;i++)
{
while(query_max(pos,i)-query_min(pos,i)>q) pos++;
ans=max(ans,i-pos+);
}
cout<<ans<<endl;
}
} int main()
{
while(cin>>n>>m)
{
if(n== && m==) break;
read();
work();
}
}
HDU 4123 Bob's Race:树的直径 + 单调队列 + st表的更多相关文章
- HDU 4123 Bob’s Race 树的直径+单调队列
题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...
- HDU 4123 Bob’s Race 树的直径 RMQ
Bob’s Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=41 ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- POJ 3162 Walking Race(树的直径+单调队列)
题目大意:对一棵树,求出从每个结点出发能到走的最长距离(每个结点最多只能经过一次),将这些距离按排成一个数组得到dis[1],dis[2],dis[3]……dis[n] ,在数列的dis中求一个最长的 ...
- HDU 4123 Bob’s Race 树的直径+ST表
Bob’s Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=41 ...
- HDU 4123 Bob’s Race 树形dp+单调队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
- hdu 4123 Bob’s Race (dfs树上最远距离+RMQ)
C - Bob’s Race Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Subm ...
- HDU 4123(树的直径+单调队列)
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4123 Bob’s Race(树形DP,rmq)
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- Python内置函数之sorted()
sorted(iterable,*,key=None,reverse=False) 对可迭代对象进行排序,默认ASCII进行排序. 例子: sorted(iterable,*,key=None,rev ...
- Ajax分页功能的实现
电脑换了固态硬盘,准备重装系统,因此打算把项目里一直延用的代码总结出来,防止丢失,以后也方便查阅.Ajax分页已经是非常普遍的技术了,所以也没什么需要特别说明的,直接贴代码: html部分 <! ...
- 安装 redis [standlone模式]
下载redis版本:https://redis.io/download 我下载的是:redis-3.0.6 下载后,在linux上 tar -zxvf redis-3.0 ...
- iOS 常用图尺寸 汇总
iCON 准备一张1024x1024尺寸的图,打开链接 http://www.atool.org/ios_logo.php 在线批量生成各种尺寸的图片 启动图LaunchImage 640x960 2 ...
- Java并发编程(一)学习大纲
(一)学习大纲 (二)线程与并发编程的概念 (三)线程安全.原子操作.复合操作.竞态条件.加锁机制(内置锁.重入) (四)对象的共享:可见性.失效数据.非原子的64位操作,加锁与可见性,volatil ...
- 划分Linux分区
/ Swap 这二个分区是必须有的. /usr linux系统都在 /usr 中 /home 用户信息都在 /home 下 /var 保持所有服务器的登录文件,且Web默认的路径在 /var中 可以 ...
- hihoCoder#1037 : 数字三角形(DP)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描写叙述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他 ...
- Centos 初始化服务器防火墙没有启动找不到/etc/sysconfig/iptables
个人博客:https://blog.sharedata.info/ 具体步骤:添加规则然后重启防火墙自动生成防火墙文件1.iptables -P OUTPUT ACCEPT #添加出规则2.servi ...
- centos7.0 安装php
1:去php官网下载对应版本的php包 2:解压php包 3:进入解压后的php包 ./configure --with-apxs2=/usr/local/apache2/bin/apxs --wit ...
- html 自动跳转,meat(http-equiv)标签详解
http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ...