题意是说给出一棵树,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. Ubuntu16.04 下创建新用户并赋予sudo权限

    https://blog.csdn.net/wales_2015/article/details/79643336

  2. ehcache实现页面整体缓存和页面局部缓存

    之前写过spring cache和ehcache的基本介绍和注解实现缓存管理,今天记录下web项目的页面缓存技术. 页面缓存是否有必要?. 这样说吧,几乎所有的网站的首页都是访问率最高的,而首页上的数 ...

  3. ubuntu常用命令解释

    1.seq 用于产生一个整数到另一个整数之间所有的整数,如:seq 3 5 输出:3 4 5 注:如果参数为一个整数,则输出1至这个数之间的所有整数 2.tee [-a] file 从标准输入设备读取 ...

  4. extern--C#调用C++等其他非托管代码

    例如: https://www.cnblogs.com/sosoft/p/extern.html

  5. 反射_IsDefined判断方法上有自定义的标签

    在.NET 4.0(当然也包括4.0以前的版本)下,用反射判断某个方法是否运用了自定义Attribute时,可以通过调用MethodInfo的IsDefined()方法进行确认.当然,IsDefine ...

  6. PHP设计模式_适配器模式

    将各种截然不同的函数接口封装成统一的API. PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API.类似的场景还有cache适 ...

  7. ubuntu 18.04 64bit如何编译安装内核

    1.获取 wget http://mirrors.163.com/kernel/v4.x/linux-4.15.13.tar.gz 2.解压 tar xvf linux-4.15.13.tar.gz ...

  8. Bzoj1101: [POI2007]Zap 莫比乌斯反演+整除分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 莫比乌斯反演 1101: [POI2007]Zap 设 \(f(i)\) 表示 \(( ...

  9. HDU 1317 XYZZY(floyd+bellman_ford判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 题意: 给出一个有向图,每到达一个点,都会加上或减去一些能量,我们要做的就是判断从1出发是否能到达n.初始 ...

  10. mac 下安装 express

    express为js的后端框架, 终端 >>>   npm install -g express-generator 然后cd到您要创建项目的目录之下,输入 >>> ...