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就可以作为观测区间,问这 ...
随机推荐
- 网络爬虫-url索引
网络爬虫-url索引 http://www.cnblogs.com/yuandong/archive/2008/08/28/Web_Spider_Url_Index.html url索引的作用是判断一 ...
- printf在终端输出时改变颜色
在调试程序时,有时候要输出大量数据,如果让printf/fprintf改变输出数据的颜色,那观察数据就方便多了. 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.转义序 ...
- 【leetcode】Divide Two Integers (middle)☆
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- Java在Windows的环境配置
JDK环境变量配置的步骤如下: 1.我的电脑-->属性-->高级-->环境变量. 2.配置用户变量: 系统变量 a.新建 JAVA_HOME C:\Program Files\Jav ...
- navicat 导入sql文件乱码问题解决
一,右键数据库链接,点击链接属性,修改以下信息,如图: 选择高级选项页签==>去掉使用MySQL字符集复选框==>选择GB2312字符编码==>点击确定 三,控制台后,show va ...
- 通过dbms_xplan.display_cursor识别低效的执行计划
dbms_xplan.display_cursor定义: function display_cursor(sql_id varchar2 default null, ...
- 《RabbitMQ in action》
Producers create messages and publish (send) them to a broker server (RabbitMQ).What’s a message? A ...
- linux netcat命令
netcat是网络工具中的“瑞士军刀”,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所 ...
- 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)
之前一直以为retain就是简单的计数器+1,copy就是重新开辟内存复制对象: 其实不是这样,原来之前的自己独自徘徊于糊涂之中. (官方SDK,对NSString属性的定义都是用copy,而不是re ...
- eclipse为hibernate.cfg.xml添加自动提示【转】
在hibernate.cfg.xml头部部分如下: <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate C ...