hdu 6110 路径交(线段树+lca)

news/2024/10/18 16:55:40/

题目:hdu 6110 路径交
分析:建好树之后dfs获得每个节点的深度,然后建立一颗线段树,每个节点维护一个路径,表示其左子节点维护的路径和右子节点维护的路径相交的路径(一棵树上两个节点相交只有一条路径),这里需要用到lca:即两个路径:a -> b, c -> d相交的路径为这四个节点(lca(a, c), lca(a, d), lca(b, c), lca(b, d))中深度较大的两个节点所连成的路径;
求两点a, b的距离可用公式:dis(a) + dis(b) - 2*dis(lca(a, b)), 其中,dis(a)代表a到达根节点的距离。这样可做到每次查询的时间为log(n)
代码如下:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;typedef pair<int, int> P;
typedef long long ll;const int INF = (int)1e9;
const int maxn = 500000 + 10;int cnt, lst[maxn], nxt[maxn], to[maxn], c[maxn];
int fa[2*maxn][20], dep[2*maxn];
ll dis[2*maxn];P p[2*maxn];
int n, m;
int q1, q2;void add(int u, int v, int d){nxt[++cnt] = lst[u]; lst[u] = cnt; to[cnt] = v, c[cnt] = d;nxt[++cnt] = lst[v]; lst[v] = cnt; to[cnt] = u, c[cnt] = d;
}void dfs(int u, int f){for (int j = lst[u]; j; j = nxt[j]){int v = to[j];if (v == f) continue;dis[v] = dis[u] + c[j];dep[v] = dep[u] + 1;fa[v][0] = u;dfs(v, u);}}void init_lca(){for (int j = 1; (1 << j) <= n; j ++)for (int i = 1; i <= n; i ++)fa[i][j] = fa[fa[i][j-1]][j-1];
}int lca(int a, int b) {if (dep[a] < dep[b]) swap(a, b);int f = dep[a] - dep[b];for (int j = 0; (1 << j) <= f; j ++)if ((1 << j) & f) a = fa[a][j];if (a != b) {for (int j = log2(n) + 1; j >= 0; j --) {if (fa[a][j] != fa[b][j]){a = fa[a][j], b = fa[b][j];}}a = fa[a][0];}return a;}bool cmp(int a, int b) {return dep[a] > dep[b];
}P unit(P t1, P t2){int a[10];a[0] = lca(t1.first, t2.first);a[1] = lca(t1.first, t2.second);a[2] = lca(t1.second, t2.first);a[3] = lca(t1.second, t2.second);sort(a, a + 4, cmp);return P(a[0], a[1]);}void build(int o, int L, int R) {if (L == R) {scanf("%d %d", &p[o].first, &p[o].second);return;}int M = L + (R-L) / 2;build(2*o, L, M);build(2*o + 1, M + 1, R);p[o] = unit(p[2*o], p[2*o + 1]);
}P query(int o, int L, int R) {if (q1 <= L && q2 >= R) {return p[o];}int M = L + (R-L) / 2, lc = 2*o, rc = 2*o + 1;if (q2 <= M) return query(lc, L, M);else if (q1 > M) return query(rc, M + 1, R);else return unit(query(lc, L, M), query(rc, M+1, R));
}int main(){freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);scanf("%d", &n);for (int i = 1; i < n; i ++) {int u, v, d;scanf("%d %d %d", &u, &v, &d);add(u, v, d);}dfs(1, 1);init_lca();scanf("%d", &m);build(1, 1, m);int kase; scanf("%d", &kase);while (kase --) {scanf("%d %d", &q1, &q2);P a = query(1, 1, m);ll ans = dis[a.first] + dis[a.second]-2*dis[lca(a.first, a.second)];printf("%lld\n", ans);}return 0;
}

http://www.ppmy.cn/news/519720.html

相关文章

HDU 6110 路径交(线段树+在线倍增LCA)

Description 给定一棵 n 个点的树,以及m条路径&#xff0c;每次询问第 L 条到第R条路径的交集部分的长度&#xff08;如果一条边同时出现在 2 条路径上,那么它属于路径的交集)。Input第一行一个数n (n<5⋅105) 接下来 n−1 行&#xff0c;每行三个数 x,y,z &#xff0c;…

leetcode-6110:网格图中递增路径的数目

leetcode-6110&#xff1a;网格图中递增路径的数目 题目解题方法一&#xff1a;dfs记忆化搜索方法二&#xff1a;动态规划&#xff08;超时&#xff09; 题目 题目连接 给你一个 m x n 的整数网格图 grid &#xff0c;你可以从一个格子移动到 4 个方向相邻的任意一个格子。 …

华为EC6110-T_华为EC6110-M优盘刷机教程_当贝桌面纯净版

华为EC6110-T_华为EC6110-M优盘刷机教程_当贝桌面纯净版 今天小编分享一个关于华为悦盒机顶盒的救砖教程&#xff0c;最近有网友向本站求助不小心把自己的机顶盒刷错固件成砖了&#xff0c; 小编今天找到一个固件希望能帮助广大机友解决问题&#xff01; 华为EC6110-M和华为E…

hdu6110(线段树+lca)

题目 http://acm.hdu.edu.cn/showproblem.php?pid6110 分析 注意到&#xff0c;若干条路径的交一定也是条路径 我们可以维护一个线段树&#xff0c;seg[l..r]存着第l条~第r条路径的交&#xff08;用起点和终点表示即可&#xff09; 维护的时候就是两个孩子对应的路径求个交作为…

EAP(6110)作业系统launchpad之开挂做题

EAP的作业非常多&#xff0c;本文将带领你如何飞一样的直接获取Launchpad上prof布置的题目答案&#xff0c;甚至直接修改成绩&#xff01;希望同学们不要举报我提供这种“作弊”的方法。本文仅供参考学习&#xff0c;大家有时间做还是尽量自己做题吧。 方法一. 针对Exercises …

OpenSSH 安全漏洞(CVE-2019-6111) 欺骗安全漏洞(CVE-2019-6110)欺骗安全漏洞(CVE-2019-6109)解决办法

漏洞情况 如标题三个漏洞未2019年1月26日发布&#xff0c;发现存在该问题的设备使用的是OpenSSH 7.9版本。 三个安全漏洞问题为scp相关问题&#xff0c;出现在openssh-client。 解决办法: 目前发现成功解决该问题的方式是在openssh官网中找到&#xff0c;官网于4月26日发布最…

EC6110M/T-Q21A/C/E-EC6108V9/V9C/V9U/V9A/V9E/V9I/V92/V97-V9C悦me/CA全系列包

华为盒子EC6110M/T-Q21A/C/E-EC6108V9/V9C/V9U/V9A/V9E/V9I/V92/V97-V9C悦me/CA-全系列-卡刷刷机固件&#xff08;当贝桌面&#xff09; 固件说明&#xff1a; 1、采用官方系统核心以及官方内核&#xff0c;确保固件运行无问题&#xff1b; 2、全局精简&#xff0c;保留基…

EC6110M破解第一步 备份固件

前言&#xff1a;装北京移动宽带送了个电视盒子&#xff0c;型号&#xff1a;华为EC6110M。苦于家里没有电视&#xff0c;连接显示器和蓝牙音箱后声音和画面不同步&#xff0c;电视电影实在没法看&#xff0c;于是它就没有了用武之地。前一段时间在搞利用路由器搭建私有网盘&am…