hdu4123-Bob’s Race(树形dp+rmq+尺取)
题意: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+尺取)的更多相关文章
- 树形DP+RMQ+尺取法 hdu4123
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 参考博客:两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race ...
- 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(树形DP+RMQ)
题目链接 Problem Description Bob wants to hold a race to encourage people to do sports. He has got troub ...
- 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 ...
- HDU-4123-树形dp+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- 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 树形DP+线段树
给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...
- POJ - 3162 Walking Race 树形dp 单调队列
POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...
随机推荐
- c/c++中一些高级函数的使用
setvbuf 函数名: setvbuf 功 能: 把缓冲区与流相关 用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size ...
- Servlet课程0424(一) 通过实现Servlet接口来开发Servlet
//这是我的第一个Servlet,使用实现Servlet接口的方式来开发 package com.tsinghua; import javax.servlet.*; import java.io.*; ...
- Struts 2 + Spring2.5 + Hibernate3整合例子
一.效果 1. 2. 二.结构 1. 2.用到jar包 antlr-2.7.6.jaraspectjrt.jaraspectjweaver.jarc3p0-0.9.1.jarcglib-nodep-2 ...
- 性能优化工具 MVC Mini Profiler
性能优化工具 MVC Mini Profiler MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC.WebForm 以及WCF 的性能分析的小程 ...
- MarshalByRefObject浅析
首先了解一下不同应用程序域中的对象的通信方式有两种: 一种是跨应用程序域边界传输对象副本 一种是使用代理交换消息. 简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用. 当一个对象需 ...
- 【HDOJ】4345 Permutation
即求P1^n1+P2^n2 + ... + Pk^nk <= n,其中Pk为素数的所有可能组合.思路是DP.1~1000的素数就不到200个.dp[i][j]表示上式和不超过且当前最小素数为P[ ...
- 1650. Billionaires(线段树)
1650 简单题 线段树的单点更新 就是字符串神马的 有点小繁琐 开两个map 一个存城市 一个存名字 #include <iostream> #include<cstdio> ...
- Oracle数据库生成UUID
从Data Ghost的blog得知,原来可以用Oracle来生成UUID,做法很简单,如下: select sys_guid() from dual; 数据类型是 raw(16) 有32个字符.
- FormsAuthentication实现单点登录
原文地址:http://www.wlm.so/Article/Detail/lmb48bk9f690n00000 单点登录,这种在网络非常常见,在这里讨论的是实现同一主域下的子站间的单点登录,同样也适 ...
- LRU与MRU算法
1.Cache Hit and Cache Miss 当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(我们称之为Cache Hit) ...