【每日一题】5. 城市网络 (树上倍增)
补题链接:Here
LCA 算法讲解:Here
考虑用
长度,实际上就是从fa跳 2^k+1 ,相当于就是跳到
注意我这里说的跳跃长度都是按照能买东西的点的个数计数,相当于我的f数组其实是对原树进行了重建,每个点往上走1步都的连向的它能到的第一个比他大的点(这样理解也许会容易很多——即我们对原树进行变形,每个点都连向它上方第一个能买东西的点,构成一个新的森林,于是问题就变成了,从u走到自己上方深度不小于dep[v]的点需要经过多少个点)。
有了这个值之后我们要求从 u 往上走到 v 经过了多少点,也可也倍增去求了——即从 u 出发尝试往上跳
这道题想了好久好久 最终还是参考清楚姐姐的思路才想明白 /(ㄒoㄒ)/~~
// Murabito-B 21/04/10
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
typedef long long ll;
vector<int> v[maxn];
int a[maxn], f[maxn][20], dep[maxn], to[maxn];
void dfs(int p, int fa) {
int x = fa;
for (int k = 19; k >= 0; k--)
if (f[x][k] && a[f[x][k]] <= a[p]) x = f[x][k]; //如果x往上跳2^k步这个点存在,且这个点的权值比a[p]要小,就跳到这个点再往上跳
if (a[x] > a[p]) f[p][0] = x; //判断比a[p]大的点到底是x还是x的上面那个点
else
f[p][0] = f[x][0];
//向上倍增的找到第一个比p权值大的点
for (int i = 1; i < 20; i++) f[p][i] = f[f[p][i - 1]][i - 1];
dep[p] = dep[fa] + 1; //维护高度
int num = v[p].size();
for (int i = 0; i < num; i++) {
int to = v[p][i];
if (to == fa) continue;
dfs(to, p); //搜子树
}
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
for (int i = n + 1; i <= n + q; i++) {
int x, y, c;
cin >> x >> y >> c;
v[i].push_back(x);
v[x].push_back(i);
a[i] = c;
to[i - n] = y; //记录对应的终点
}
dfs(1, 0);
for (int i = 1; i <= q; i++) {
int ans = 0;
int x = i + n; //i+n是第i个询问的起点
for (int k = 19; k >= 0; k--) { //k从大到小枚举
if (dep[f[x][k]] >= dep[to[i]]) { //如果跳完之后深度小于目标点深度就已经走过了,跳跃高度要减小
ans += (1 << k); //点数加2^k
x = f[x][k]; //向上跳2^k个点
}
}
cout << ans << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
2020-04-10 LeetCode | 189. 旋转数组
2020-04-10 LeetCode | 151. 翻转字符串里的单词