题意:Bob想要开一个运动会,有n个房子和n-1条路(一棵树),Bob希望每个人都从不同的房子开始跑,要求跑的尽可能远,而且每条路只能走最多一次。Bob希望所有人跑的距离的极差不大于q,如果起点的编号需要连续,那么最多多少个起点。

题解:首先求出每个点所能跑的最大距离(参考hdu2196),问题将转化成给n个数字,求差值不超过q的最大区间。m个询问,n个数,N<=50000 M<=500,所以对于每一次询问可以在O(n)的复杂度求解,st算法求区间最大最小值,尺取法求最大长度。

(去年做2196的时候做了两三天,这次一下就写出来了,而且没怎么调,1A,开心^_^

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = ;
const int INF = 0x5f5f5f5f;
struct Edge {
int to, cost, next;
} edge[N*];
int head[N];
int cnt_edge;
void add_edge(int u, int v, int c) {
edge[cnt_edge].to = v;
edge[cnt_edge].cost = c;
edge[cnt_edge].next = head[u];
head[u] = cnt_edge++;
} int d[N], mx[N], smx[N], mid[N], smid[N];
void dfs(int u, int fa) {
smx[u] = mx[u] = ;
mid[u] = smid[u] = ;
for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
int c = edge[i].cost;
if (v == fa) continue;
dfs(v, u);
if (mx[v]+c > smx[u]) {
smx[u] = mx[v]+c;
smid[u] = v;
}
if (smx[u] > mx[u]) {
swap(smx[u], mx[u]);
swap(smid[u], mid[u]);
}
}
}
int ans[N];
void dfs(int u, int fa, int x) { if (fa == -) { //没有父亲结点 向下的最大值就是最大值
d[u] = ;
} else if (mid[fa] == u) {
d[u] = max(x+smx[fa], d[fa]+x);
} else {
d[u] = max(x+mx[fa], d[fa]+x);
}
ans[u] = max(d[u], mx[u]); for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
int c = edge[i].cost;
if (v == fa) continue;
dfs(v, u, c);
}
} int f1[N][], f2[N][];
void init(int n)
{
// f[i,j]表示[i,i+2^j-1]区间最大值
// f[i,j]=max(d[i,j-1], d[i+2^(j-1),j-1])
for (int i = ; i <= n; ++i) f2[i][] = f1[i][] = ans[i];
for (int j = ; (<<j) <= n; ++j)
for (int i = ; i+j- <= n; ++i) {
f1[i][j] = max(f1[i][j-], f1[i+(<<j-)][j-]);
f2[i][j] = min(f2[i][j-], f2[i+(<<j-)][j-]);
}
} int query(int l, int r)
{
int k = ;
while (<<k+ <= r-l+) ++k;
return max(f1[l][k], f1[r-(<<k)+][k]) - min(f2[l][k], f2[r-(<<k)+][k]);
} int main() {
int n, m;
while (~scanf("%d%d", &n, &m) && n) {
int u, v, c;
memset(head, -, sizeof head);
cnt_edge = ;
for (int i = ; i < n; ++i) {
scanf("%d%d%d", &u, &v, &c);
add_edge(u, v, c);
add_edge(v, u, c);
}
//10000000 q
dfs(, -);
dfs(, -, );
//for (int i = 1; i <= n; ++i) printf("d[%d]=%d\n", i, ans[i]);
init(n);
while (m--) {
int q; scanf("%d", &q);
int r = ;
int res = ;
for (int i = ; i <= n; ++i) {
while (r <= n && query(i, r) <= q) r++;
res = max(res, r-i);
}
printf("%d\n", res);
}
}
return ;
}

hdu4123-Bob’s Race(树形dp+rmq+尺取)的更多相关文章

  1. 树形DP+RMQ+尺取法 hdu4123

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 参考博客:两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race ...

  2. HDU 4123 Bob’s Race 树形dp+单调队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...

  3. hdu 4123--Bob’s Race(树形DP+RMQ)

    题目链接 Problem Description Bob wants to hold a race to encourage people to do sports. He has got troub ...

  4. 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 ...

  5. HDU-4123-树形dp+rmq+尺取

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  7. hdu 4123 Bob’s Race 树的直径+rmq+尺取

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  8. POJ 3162 Walking Race 树形DP+线段树

    给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...

  9. POJ - 3162 Walking Race 树形dp 单调队列

    POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...

随机推荐

  1. c/c++中一些高级函数的使用

    setvbuf 函数名: setvbuf 功 能: 把缓冲区与流相关 用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size ...

  2. Servlet课程0424(一) 通过实现Servlet接口来开发Servlet

    //这是我的第一个Servlet,使用实现Servlet接口的方式来开发 package com.tsinghua; import javax.servlet.*; import java.io.*; ...

  3. Struts 2 + Spring2.5 + Hibernate3整合例子

    一.效果 1. 2. 二.结构 1. 2.用到jar包 antlr-2.7.6.jaraspectjrt.jaraspectjweaver.jarc3p0-0.9.1.jarcglib-nodep-2 ...

  4. 性能优化工具 MVC Mini Profiler

    性能优化工具 MVC Mini Profiler   MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC.WebForm 以及WCF 的性能分析的小程 ...

  5. MarshalByRefObject浅析

    首先了解一下不同应用程序域中的对象的通信方式有两种: 一种是跨应用程序域边界传输对象副本 一种是使用代理交换消息. 简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用. 当一个对象需 ...

  6. 【HDOJ】4345 Permutation

    即求P1^n1+P2^n2 + ... + Pk^nk <= n,其中Pk为素数的所有可能组合.思路是DP.1~1000的素数就不到200个.dp[i][j]表示上式和不超过且当前最小素数为P[ ...

  7. 1650. Billionaires(线段树)

    1650 简单题 线段树的单点更新 就是字符串神马的 有点小繁琐 开两个map 一个存城市 一个存名字 #include <iostream> #include<cstdio> ...

  8. Oracle数据库生成UUID

    从Data Ghost的blog得知,原来可以用Oracle来生成UUID,做法很简单,如下: select sys_guid() from dual;  数据类型是 raw(16) 有32个字符.

  9. FormsAuthentication实现单点登录

    原文地址:http://www.wlm.so/Article/Detail/lmb48bk9f690n00000 单点登录,这种在网络非常常见,在这里讨论的是实现同一主域下的子站间的单点登录,同样也适 ...

  10. LRU与MRU算法

    1.Cache Hit and Cache Miss 当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(我们称之为Cache Hit) ...