题意是说给出一棵树,N(10^5)个顶点,以及每条边的权值,现在需要选择连续的K个点(顶点编号连续),可以被选出来的条件是:

若d[i]代表顶点i到树上其他点的距离的最大值,使得区间[a, b]的d值的最大差值不大于Q,

也就是max(d[a], d[a + 1], ..., d[b]) - max(d[a], d[a + 1], ..., d[b]) <= Q

Q是给出的一个查询(共有m<=500个查询),求对应每一个查询的K的最大值

思路是首先预处理出每个点到其他点的最大距离, 这可以通过两遍dfs算出来,然后对于每一个查询Q,找出一个最大长度的区间,使得这个区间的最大最小值差<=Q,所以还需要RMQ预处理出每个区间的最大值与最小值(这里查询需要做到O(1)),然后扫描一遍数组便可以得到这个最大长度的区间。

 #pragma comment(linker, "/STACK:1677721600")
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf (-((LL)1<<40))
#define lson k<<1, L, (L + R)>>1
#define rson k<<1|1, ((L + R)>>1) + 1, R
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define FIN freopen("in.txt", "r", stdin)
#define FOUT freopen("out.txt", "w", stdout)
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define dec(i, a, b) for(int i = a; i >= b; i --) template<class T> T MAX(T a, T b) { return a > b ? a : b; }
template<class T> T MIN(T a, T b) { return a < b ? a : b; }
template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b; } //typedef __int64 LL;
typedef long long LL;
const int MAXN = + ;
const int MAXM = ;
const double eps = 1e-;
LL MOD = ; struct Node {
int v, s;
Node(int _v = , int _s = ) {
v = _v; s = _s;
}
}; vector<Node>G[MAXN];
int mx[MAXN], se[MAXN], d[MAXN], idx[MAXN];
int ma[MAXN][], mi[MAXN][];
int n, u, v, w;
int m, Q; void init(int n) {
rep (i, , n) G[i].clear();
mem0(mx); mem0(se);
} void dfs1(int u, int fa) {
mx[u] = se[u] = ;
int sz = G[u].size();
rep (i, , sz - ) {
int v = G[u][i].v;
if(v == fa) continue;
dfs1(v, u);
int len = G[u][i].s + mx[v];
if(len > mx[u]) se[u] = mx[u], mx[u] = len;
else if(len > se[u]) se[u] = len;
}
} void dfs2(int u, int fa, int dis) {
d[u] = max(dis, max(mx[u], se[u]));
int sz = G[u].size();
rep (i, , sz - ) {
int v = G[u][i].v, len = G[u][i].s;
if(v == fa) continue;
if(len + mx[v] == mx[u])
dfs2(v, u, max(dis, se[u]) + len);
else
dfs2(v, u, max(dis, mx[u]) + len);
}
} void rmq_init(int n) {
rep (i, , n) ma[i][] = mi[i][] = d[i];
for(int j = ; (<<j) <= n; j ++) {
for(int i = ; i + (<<j) - <= n; i ++) {
ma[i][j] = max(ma[i][j - ], ma[i + ( << (j - ))][j - ]);
mi[i][j] = min(mi[i][j - ], mi[i + ( << (j - ))][j - ]);
}
}
rep (len, , n) {
idx[len] = ;
while(( << (idx[len] + )) <= len) idx[len] ++;
}
} int rmq(int l, int r) {
int k = idx[r - l + ];
return max(ma[l][k], ma[r - ( << k) + ][k]) - min(mi[l][k], mi[r - ( << k) + ][k]);
} int main()
{
// FIN;
while(~scanf("%d %d", &n, &m) && n) {
init(n);
rep (i, , n - ) {
scanf("%d %d %d", &u, &v, &w);
G[u].push_back(Node(v, w));
G[v].push_back(Node(u, w));
} //计算每个点到叶子节点的最远距离
dfs1(, -);
dfs2(, -, ); //计算答案
rmq_init(n);
while(m --) {
scanf("%d", &Q);
int l = , ans = ;
rep (i, , n) {
while(l < i && rmq(l, i) > Q) l ++;
ans = max(ans, i - l + );
}
cout << ans << endl;
}
}
return ;
}

HDU 4123 Bob’s Race(RMQ)的更多相关文章

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

  2. hdu 4123 Bob’s Race (dfs树上最远距离+RMQ)

    C - Bob’s Race Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

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

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

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

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

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

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

  7. hdu 3183 A Magic Lamp(RMQ)

    A Magic Lamp                                                                               Time Limi ...

  8. HDU 4123 Bob's Race:树的直径 + 单调队列 + st表

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...

  9. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

随机推荐

  1. Rails的HashWithIndifferentAccess

    ruby 2.0 引入了keyword arguments,方法的参数可以这么声明 def foo(bar: 'default') puts bar end foo # => 'default' ...

  2. 91. Decode Ways(动态规划 26个字母解码个数)

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  3. Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project

    本文转自:http://www.phperz.com/article/14/1205/39544.html 本文向大家讲解了Myeclipse错误:Errors occurred during the ...

  4. ABP官方文档翻译 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  5. springboot+mybatis项目自动生成

    springboot_data_access_demo基于rapid,根据自定义模版生成的基于mybatis+mysql的数据库访问示例项目.简单配置数据库信息,配置不同的生成策略生成可以直接运行访问 ...

  6. RESTful源码笔记之RESTful Framework的APIview, Viewset总结分析

    0x00  引言 官方文档:http://www.django-rest-framework.org/drf为我们提供强大的通用view的功能,本博客对这些view进行简要的总结分析.首先,我们看一下 ...

  7. linux第七章读书笔记

    Vim编辑器 Vim 仅仅通过键盘来在插入和执行命令等多种模式之间切换.这使得Vim可以不用进行菜单或者鼠标操作,并且最小化组合键的操作,对文字录入员或者程序员可以大大增强速度和效率. CHAPTER ...

  8. CF_884_F(NetFlow)

    codeforces_884_f 题目大意:给出一串长为n的字符串(保证n为偶数),定义反回文串为每一个位置的对应位置上的字母都不等于它(for each i : s[i] != s[n+1-i]), ...

  9. CF_863_F(Netflow)

    codeforces_863_F 题目大意:给出一个数组的大小(n<=50),以及每个位置填数的范围限制(若无限制,即为1-n),最后求填出数组的最小花费,定义总花费为数组中每个数出现次数的平方 ...

  10. (转载)ubuntu卸载opencv并重装opencv3.0.0

    ubuntu卸载opencv并重装opencv3.0.0 一. 卸载opencv2.4.9: Going to the "build" folder directory of op ...