当前位置: 首页 > wzjs >正文

百度seo站长成都抖音seo

百度seo站长,成都抖音seo,美克美家网站建设,centos建WordPress蓝桥杯 2023 省赛 B 组 I 题 - 景区导游题解 题目分析 这道题目描述了一个树状结构的景区,景点之间通过摆渡车线路相连。我们需要计算在跳过游览路线中某一个景点后,整个游览路线所需的总时间。 解题思路 树结构处理:景点之间形成一棵树&…

蓝桥杯 2023 省赛 B 组 I 题 - 景区导游题解

题目分析

这道题目描述了一个树状结构的景区,景点之间通过摆渡车线路相连。我们需要计算在跳过游览路线中某一个景点后,整个游览路线所需的总时间。

解题思路

  1. 树结构处理:景点之间形成一棵树,我们需要高效地计算树上任意两点之间的距离。
  2. LCA(最近公共祖先):为了快速计算树上两点间距离,我们可以使用LCA技术。两点u和v之间的距离等于dist[u] + dist[v] - 2 * dist[lca(u,v)],其中dist[u]表示从根节点到u的距离。
  3. 预处理:使用广度优先搜索(BFS)预处理每个节点的深度、到根节点的距离以及倍增数组,用于快速查询LCA。
  4. 路线计算:对于原定游览路线,先计算完整路线总时间。然后对于每个可能跳过的景点,计算跳过后的路线时间:
    • 跳过第一个景点:总时间减去第一个景点到第二个景点的时间
    • 跳过最后一个景点:总时间减去倒数第二个景点到最后一个景点的时间
    • 跳过中间某个景点:总时间减去前一个景点到当前景点的时间,减去当前景点到后一个景点的时间,再加上前一个景点直接到后一个景点的时间

代码实现

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10, M = N * 2;
int n, m;
int arr[N];
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}int f[N][16], depth[N];
int dist[N];
int q[M];// 预处理每个节点的深度和倍增数组
void bfs()
{depth[1] = 1; // 1是第一层源点int tt = -1, hh = 0;q[++tt] = 1;while (hh <= tt){auto u = q[hh++];for (int i = h[u]; i != -1; i = ne[i]){int v = e[i];if (!depth[v]){ // 该点未被处理q[++tt] = v;depth[v] = depth[u] + 1; // 深度 + 1dist[v] = dist[u] + w[i];f[v][0] = u;                  // u是当前节点的父节点for (int k = 1; k <= 15; k++) // 当前节点倍增往上跳f[v][k] = f[f[v][k - 1]][k - 1];}}}
}int lca(int a, int b)
{// 将两个节点跳到同深度if (depth[a] < depth[b])swap(a, b); // 确保a在b的下方for (int k = 15; k >= 0; k--)if (depth[f[a][k]] >= depth[b])a = f[a][k];// 两个节点同时向上跳if (a == b)return a;for (int k = 15; k >= 0; k--)if (f[a][k] != f[b][k])a = f[a][k], b = f[b][k];// 返回两个节点的父节点return f[a][0];
}int getDis(int a, int b)
{return dist[a] + dist[b] - 2 * dist[lca(a, b)];
}void solve()
{memset(h, -1, sizeof h);cin >> n >> m;for (int i = 1; i < n; i++){int a, b, c;cin >> a >> b >> c;add(a, b, c), add(b, a, c);}bfs();long long tot = 0; // 总时间for (int i = 1; i <= m; i++)cin >> arr[i];// 计算完整路线总时间for (int i = 1; i < m; i++)tot += getDis(arr[i], arr[i + 1]);// 计算跳过每个景点后的时间for (int i = 1; i <= m; i++){int ans = 0;if (i == 1){ // 跳过第一个景点ans = tot - getDis(arr[i], arr[i + 1]);}else if (i == m){ // 跳过最后一个景点ans = tot - getDis(arr[i - 1], arr[i]);}else{ // 跳过中间景点ans = tot - getDis(arr[i - 1], arr[i]) - getDis(arr[i], arr[i + 1]) + getDis(arr[i - 1], arr[i + 1]);}cout << ans << " ";}
}signed main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);solve();return 0;
}

复杂度分析

  1. 预处理阶段:BFS遍历整棵树,时间复杂度O(N)。每个节点处理16次倍增数组,总时间复杂度O(N log N)。
  2. 查询阶段
    • 计算完整路线时间:O(K)
    • 每个查询处理:O(1)(因为已经预处理了LCA和距离)
    • 总查询时间复杂度:O(K)

因此,算法的总时间复杂度为O(N log N + K),能够高效处理题目给出的数据规模。

总结

本题的关键在于利用LCA技术高效计算树上两点间距离,并通过预处理将查询时间优化到常数级别。这种方法适用于需要频繁查询树上路径问题的场景。

http://www.dtcms.com/wzjs/4275.html

相关文章:

  • 网站设计怎么做背景颜色长沙seo优化价格
  • 手机网站抢拍是怎么做的产品关键词怎么找
  • 可信赖的深圳网站建设百度普通版下载
  • 彩虹云免费主机系统优化大师官方下载
  • 贵州省建设厅建筑官方网站百度网盘官网登陆入口
  • 动态网站首页模版ueeshop建站费用
  • 婚恋网网站架构google关键词排名优化
  • 商城网站多少钱搜索引擎营销简称seo
  • 北京网站制作费用平台关键词排名优化
  • 网站规划说明sem推广外包
  • 做神马网站优化排名it培训机构
  • 北京大学网站建设广州各区正在进一步优化以下措施
  • 如何建立手机论坛seo查询工具网站
  • 网站建设从入门到精通什么是新媒体营销
  • 番禺建设网站开发给你一个网站seo如何做
  • 湖南做网站磐石网络网络营销就业方向和前景
  • 万江区网站仿做上海比较大的优化公司
  • 备案名称和网站名称网站推广的方法有哪几种
  • 网站建设公司公司好域名查询大全
  • 手机网站开发框架seo咨询茂名
  • 做网站的内容淘宝指数网站
  • 德文网站建设百度百度一下
  • 兰州网站制作成都windows优化大师是自带的吗
  • 网站建设加推广自动搜索关键词软件
  • 网站站内推广想找搜索引擎优化
  • 上海官网建设教程如何提升网站seo排名
  • 怎样找做淘宝客的网站360地图怎么添加商户
  • 安徽苏亚建设安装有限公司网站百度新闻网
  • 中石化两学一做网站龙岗网站推广
  • 网站制作优势太原关键词优化软件