[HDU4123]Bob’s Race
题目大意:
给定一棵$n$个点并且有边权的树,每个点的权值为该点能走的最远长度,并输入$m$个询问,每次询问最多有多少个编号连续的点,他们的最大最小点权差小于等于$Q$。
思路:
两趟DP(DFS)求出每个点能走的最远长度,然后用ST算法预处理出每一段最大最小值。
对于每组询问,用尺取法求出最大值。
注意log2不能用cmath里面的函数(尤其是不能在for语句上),不然会TLE,最好是自己实现。
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline int log2(const float x){
return ((unsigned&)x>>&)-;
}
const int N=,logN=;
struct Edge {
int to,w;
};
std::vector<Edge> e[N];
inline void add_edge(const int u,const int v,const int w) {
e[u].push_back((Edge){v,w});
}
int w[N][],son[N];
void dfs1(const int x,const int par) {
w[x][]=w[x][]=;
for(unsigned i=;i<e[x].size();i++) {
int &y=e[x][i].to;
if(y==par) continue;
dfs1(y,x);
if(w[y][]+e[x][i].w>w[x][]) {
w[x][]=w[x][];
w[x][]=w[y][]+e[x][i].w;
son[x]=y;
}
else if(w[y][]+e[x][i].w>w[x][]) {
w[x][]=w[y][]+e[x][i].w;
}
}
}
void dfs2(const int x,const int par) {
for(unsigned i=;i<e[x].size();i++) {
int &y=e[x][i].to;
if(y==par) continue;
w[y][]=std::max(w[x][],son[x]!=y?w[x][]:w[x][])+e[x][i].w;
dfs2(y,x);
}
}
int max[N][logN],min[N][logN];
inline int getsum(const int l,const int r) {
int k=log2(r-l+);
return std::max(max[l][k],max[r-(<<k)+][k])-std::min(min[l][k],min[r-(<<k)+][k]);
}
int main() {
for(;;) {
int n=getint(),m=getint();
if(!n&&!m) return ;
for(int i=;i<n;i++) {
int u=getint(),v=getint(),w=getint();
add_edge(u,v,w);
add_edge(v,u,w);
}
dfs1(,);
dfs2(,);
for(int i=;i<=n;i++) {
max[i][]=min[i][]=std::max(w[i][],w[i][]);
}
for(int j=;<<j<=n;j++) {
for(int i=;i<=n-(<<j)+;i++) {
max[i][j]=std::max(max[i][j-],max[i+(<<(j-))][j-]);
min[i][j]=std::min(min[i][j-],min[i+(<<(j-))][j-]);
}
}
while(m--) {
int q=getint(),ans=;
for(int l=,r=;l<=r;l++) {
for(;r<=n&&getsum(l,r)<=q;r++);
ans=std::max(ans,r-l);
}
printf("%d\n",ans);
}
for(int i=;i<=n;i++) e[i].clear();
}
}
[HDU4123]Bob’s Race的更多相关文章
- POJ 4003 Bob’s Race && HDU4123 Bob’s Race (dfs+rmq)
Bob’s Race Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 378 Accepted: 119 Descript ...
- 刷题总结——Bob's Race(hdu4123 树形dp+st表)
题目: Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the ro ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- 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(树形DP,rmq)
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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 树的直径+ST表
Bob’s Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=41 ...
- 树形DP+RMQ+单调队列(Bob’s Race HDU4123)
题意:有n个房子,这些房子被n-1条道路连接,有一些运动员从一个房子为起点尽可能跑最远的距离且不能通过一条道路超过两次,这些运行员不能选择同样的起点,这些运动员跑的最远距离和最近距离的差值不能超过Q, ...
随机推荐
- JQuery中2个等号与3个等号的区别
首先,== equality 等同,=== identity 恒等.==, 两边值类型不同的时候,要先进行类型转换,再比较.===,不做类型转换,类型不同的一定不等. 下面分别说明:先说 ===,这个 ...
- SQL记录-PLSQL函数
PL/SQL函数 PL/SQL函数与过程相同,不同之处在于函数有一个返回值.因此,前面的章节中的所有讨论都适用于函数. 创建函数 建立一个独立函数可以使用CREATE FUNCTION语句创建.CRE ...
- ASP.NET MVC学习(二)之控制器Controller
1.控制器 Controller接收用户请求,将Model和View匹配在一起,共同完成用户请求.它是一个分发器,通过选择不同的Model.View,可以决定完成不同的用户请求. 但Controlle ...
- 阿里云Linux服务器挂载数据盘
步骤1.登录服务器2.检查磁盘信息 命令:fdisk -l3.磁盘分区 命令:fdisk /dev/xvdb 查看命令帮助 m n //新增一个分区 p //建立一个主分区 1 //设置盘符为1 回车 ...
- 20155207王雪纯 2016-2017-2 《Java程序设计》第六周学习总结
20155207 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第10章 输入/输出 10.1 InputStream与OutputStream 10.1. ...
- auto
把左和右外边距设置为 auto,规定的是均等地分配可用的外边距.结果就是居中的元素: <style> .centerrr { margin:auto; width:70%; backgro ...
- python模块分析之time和datetime模块
前言 我们使用time和datetime模块的主要目的是对时间戳.时间字符串.时间元组等时间的表述对象进行相互的转化.而我们平时编码涉及两个时间:一个是上海时间,也可以说是北京时间,一个是UTC时间, ...
- Jenkins 安装及使用
jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作. 可以用它做网站代码提交,更新. 1,安装 首先确保目标机器上装有 java jdk 版本最好在 1.6 以上,小编使用的是 ...
- python3 操作appium
# -*- coding: utf-8 -*- # @Time : 2018/10/8 11:00 # @Author : cxa # @File : test.py # @Software: PyC ...
- Pandas DataFrame数据的增、删、改、查
Pandas DataFrame数据的增.删.改.查 https://blog.csdn.net/zhangchuang601/article/details/79583551 #删除列 df_2 = ...