#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)

#6073. 「2017 山东一轮集训 Day5」距离

给定一颗有nnn个节点带边权的树,以及一个排列ppppath(u,v)path(u, v)path(u,v)u,vu, vu,v路径上的点集,dist(u,v)dist(u, v)dist(u,v)u,vu, vu,v之间的最短路的长度。

mmm次询问,每次给定u,v,ku, v, ku,v,k,要求∑i∈path(u,v)dist(pi,k)\sum\limits_{i \in path(u, v)}dist(p_i, k)ipath(u,v)dist(pi,k),要求在线求解。

我们选定111号节点为根节点,定义d(i)d(i)d(i)为点iii到根节点的距离,考虑初始的∑i∈paht(u,v)dist(pi,k)\sum\limits_{i \in paht(u, v)} dist(p_i, k)ipaht(u,v)dist(pi,k),有如下:
∑i∈path(u,v)dist(pi,k)=∑i∈path(u,v)(d(pi)+d(k)−2×d(lca(pi,k)))\sum\limits_{i \in path(u, v)}dist(p_i, k) = \sum_{i \in path(u, v)}\left(d(p_i) + d(k) - 2 \times d(lca(p_i, k))\right)\\ ipath(u,v)dist(pi,k)=ipath(u,v)(d(pi)+d(k)2×d(lca(pi,k)))
对于d(k)d(k)d(k)的计算,由于d(k)d(k)d(k)是一个定值,则这一部分的答案即为u,vu, vu,v间点的个数$ \times d(k)$。

对于d(pi)d(p_i)d(pi)的计算,我们考虑树上差分前缀和来求解,我们定义sum[n]=∑i∈paht(1,n)d(pi)sum[n] = \sum\limits_{i \in paht(1, n)}d(p_i)sum[n]=ipaht(1,n)d(pi)

∑i∈path(u,v)d(pi)=sum[u]+sum[v]−sum[lca(u,v)]−sum[fa(lca(u,v))]\sum\limits_{i \in path(u, v)} d(p_i) = sum[u] + sum[v] - sum[lca(u, v)] - sum[fa(lca(u, v))]ipath(u,v)d(pi)=sum[u]+sum[v]sum[lca(u,v)]sum[fa(lca(u,v))]

最后一步,考虑最难算的∑i∈path(u,v)d(lca(pi,k))\sum\limits_{i \in path(u, v)} d(lca(p_i, k))ipath(u,v)d(lca(pi,k)),可以仿照P4211 [LNOI2014]LCA这题的计算方式,

由于强制在线,所以这题必须用主席树,我们定义点iii所代表的主席树为从1−>i1->i1>i上,也就是根节点到iii上,

pi−>1p_i->1pi>1所代表的信息,最后我们只需要四颗主席树即可解决问题u+v−lca(u,v)−fa(lca(u,v))u + v - lca(u, v) - fa(lca(u, v))u+vlca(u,v)fa(lca(u,v))

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5 + 10;int head[N], to[N << 1], nex[N << 1], value[N << 1], cnt = 1;int p[N], n, m, type;int fa[N], sz[N], son[N], top[N], rk[N], id[N], dep[N], w[N], tot;int root[N], ls[N * 100], rs[N * 100], num;ll dis[N], len[N], s[N], sum[N * 100], lazy[N * 100];void add(int x, int y, int w) {to[cnt] = y;nex[cnt] = head[x];value[cnt] = w;head[x] = cnt++;
}void dfs1(int rt, int f) {fa[rt] = f, dep[rt] = dep[f] + 1, sz[rt] = 1;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dis[to[i]] = dis[rt] + value[i];dfs1(to[i], rt);w[to[i]] = value[i];sz[rt] += sz[to[i]];if (!son[rt] || sz[son[rt]] < sz[to[i]]) {son[rt] = to[i];}}
}void dfs2(int rt, int tp) {rk[++tot] = rt, id[rt] = tot, len[tot] = w[rt], top[rt] = tp;if (!son[rt]) {return ;}dfs2(son[rt], tp);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa[rt] || to[i] == son[rt]) {continue;}dfs2(to[i], to[i]);}
}int lca(int u, int v) {while (top[u] != top[v]) {if (dep[top[u]] < dep[top[v]]) {swap(u, v);}u = fa[top[u]];}return dep[u] < dep[v] ? u : v;
}void update(int &rt, int pre, int l, int r, int L, int R) {rt = ++num;ls[rt] = ls[pre], rs[rt] = rs[pre], sum[rt] = sum[pre], lazy[rt] = lazy[pre];sum[rt] += len[min(r, R)] - len[max(l, L) - 1];if (l >= L && r <= R) {lazy[rt] += 1;return ;}int mid = l + r >> 1;if (L <= mid) {update(ls[rt], ls[pre], l, mid, L, R);}if (R > mid) {update(rs[rt], rs[pre], mid + 1, r, L, R);}
}ll query(int u, int v, int f, int ff, int l, int r, int L, int R) {if (l >= L && r <= R) {return sum[u] + sum[v] - sum[f] - sum[ff];}ll ans = (lazy[u] + lazy[v] - lazy[f] - lazy[ff]) * (len[min(r, R)] - len[max(l, L) - 1]);int mid = l + r >> 1;if (L <= mid) {ans += query(ls[u], ls[v], ls[f], ls[ff], l, mid, L, R);}if (R > mid) {ans += query(rs[u], rs[v], rs[f], rs[ff], mid + 1, r, L, R);}return ans;
}void dfs(int rt, int f) {s[rt] = s[f] + dis[p[rt]];int cur = p[rt];root[rt] = root[f];while (cur) {update(root[rt], root[rt], 1, n, id[top[cur]], id[cur]);cur = fa[top[cur]];}for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs(to[i], rt);}
}ll query(int u, int v, int f, int ff, int rt) {ll ans = 0;while (rt) {ans += query(root[u], root[v], root[f], root[ff], 1, n, id[top[rt]], id[rt]);rt = fa[top[rt]];}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d %d", &type, &n, &m);for (int i = 1, u, v, w; i < n; i++) {scanf("%d %d %d", &u, &v, &w);add(u, v, w);add(v, u, w);}for (int i = 1; i <= n; i++) {scanf("%d", &p[i]);}dfs1(1, 0);dfs2(1, 1);for (int i = 1; i <= n; i++) {len[i] += len[i - 1];}dfs(1, 0);ll ans = 0;for (int i = 1, u, v, k; i <= m; i++) {scanf("%d %d %d", &u, &v, &k);u = u ^ (ans * type), v = v ^ (ans * type), k = k ^ (ans * type);int f = lca(u, v), ff = fa[f];ans = (dep[u] + dep[v] - dep[f] - dep[ff]) * dis[k];ans += s[u] + s[v] - s[f] - s[ff];ans -= 2 * query(u, v, f, ff, k);printf("%lld\n", ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ML.NET 示例:搜索引擎结果排名

ML.NET 示例中文版&#xff1a;https://github.com/feiyun0112/machinelearning-samples.zh-cn/edit/master/samples/csharp/getting-started/Ranking_Web英文原版请访问&#xff1a;https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-st…

深入理解 JVM Class文件格式(四)

&#xff08;3&#xff09;CONSTANT_Integer_info 一个常量池中的CONSTANT_Integer_info数据项, 可以看做是CONSTANT_Integer类型的一个实例。 它存储的是源文件中出现的int型数据的值。 同样&#xff0c; 作为常量池中的一种数据类型&#xff0c; 它的第一个字节也是一个tag值…

.Net Core中使用Quartz.Net Vue开即用的UI管理

Quartz.NETQuartz.Net 定制UI维护了常用作业添加、删除、修改、停止、启动功能&#xff0c;直接使用cron表达式设置作业执行间隔&#xff0c;有完整的日志记录。Quartz.NET是一个功能齐全的开源作业调度系统&#xff0c;可用于从最小的应用程序到大型企业系统。Quartz.NET是一个…

Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]

Ancient Distance 给定一颗根为111有nnn个节点的树&#xff0c;每次可以选定树上kkk节点当作特殊节点&#xff0c; 定义dis(u)dis(u)dis(u)为&#xff0c;从u−>1u->1u−>1遇上的第一个特殊点的距离&#xff0c;如果遇不上特殊点则dis(u)dis(u)dis(u)无穷大。 有nn…

深入理解 JVM Class文件格式(五)

&#xff08;8&#xff09; CONSTANT_Class_info 常量池中的一个CONSTANT_Class_info&#xff0c; 可以看做是CONSTANT_Class数据类型的一个实例。 他是对类或者接口的符号引用。 它描述的可以是当前类型的信息&#xff0c; 也可以描述对当前类的引用&#xff0c; 还可以描述对…

混沌工程详细介绍——Netflix持续交付实践探寻

内容来源&#xff1a;DevOps案例深度研究 – Netflix的文化与工程实践战队&#xff08;本文只展示部分案例PPT及研究成果&#xff0c;更多细节请关注案例分享活动&#xff0c;及本公众号&#xff09;。本案例内容贡献者&#xff1a;高金梅&#xff0c;李晓莉&#xff0c;潘雄鹰…

P4175 [CTSC2008]网络管理(整体二分)

P4175 [CTSC2008]网络管理 给定一棵有nnn个节点的树&#xff0c;点有点权&#xff0c;有两种操作&#xff1a;① 修改某个点的点权&#xff0c;② 查询两点路径间的点权第kkk大。 给定u,vu, vu,v&#xff0c;选定111号节点为根节点&#xff0c;设inf(x)inf(x)inf(x)表示从根节…

深入理解 JVM Class文件格式(六)

经过前几篇文章&#xff0c; 终于将常量池介绍完了&#xff0c; 之所以花这么大的功夫介绍常量池&#xff0c; 是因为对于理解class文件格式&#xff0c;常量池是必须要了解的&#xff0c; 因为class文件中其他地方&#xff0c;大量引用了常量池中的数据项。 对于还不了解常量池…

远程开发初探 - VS Code Remote Development

如果你是学生&#xff0c;你还在你的 windows 电脑上为各种环境配置头疼的时候&#xff0c;你应该了解一下 Remote Development。如果你喜欢 linux 的开发环境和舒适的 shell&#xff0c;但却不舍得抛弃 windows/macos 图形界面给你带来的用户体验和一些软件的兼容(QQ, 微信), …

深入理解 JVM Class文件格式(七)

本专栏列前面的一系列博客&#xff0c; 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中&#xff0c; 我们介绍了&#xff1a; this_class 对当前类的描述 super_class 对当前类的超类的描述 in…

P3250 [HNOI2016]网络(整体二分)

P3250 [HNOI2016]网络 给定一棵树&#xff0c;有三种操作&#xff1a; 给定u,v,wu, v, wu,v,w&#xff0c;表示u,vu, vu,v路径上有一个重要度为www的请求&#xff0c;给定ttt&#xff0c;第ttt个发生的请求结束&#xff0c;给定一个xxx&#xff0c;假设xxx发生故障&#xff0…

微信小程序集成腾讯云 IM SDK

1、背景因业务功能需求需要接入IM&#xff08;即时聊天&#xff09;功能&#xff0c;一开始想到的是使用 WebSocket 来实现这个功能&#xff0c;然天意捉弄&#xff08;哈哈&#xff09;服务器版本太低不支持 wx 协议&#xff08;也就不支持 WebSocket了&#xff09;不得不寻找…

深入理解 JVM Class文件格式(八)

在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中&#xff0c; 我们主要讲解了什么是虚拟机&#xff0c; 这篇博客是对JVM的一个概述。 在随后的几篇文章中&#xff0c;一直在讲解class文件格式。 在今天这篇博客中&#xff0c; 将会继续讲解class文件中的其他信息。 在本…

Function!(计蒜客 - 42386)

Function! fa(x)ax(a>0,a≠1)f_a(x) a ^ x(a > 0, \ a \neq 1)fa​(x)ax(a>0, a​1)&#xff0c;我们要求∑a2n(a∑ban⌊fa−1(b)⌋⌈fb−1(a)⌉)\sum\limits_{a 2} ^{n} \left(a \sum\limits_{b a} ^{n} \lfloor f_a ^{-1}(b) \rfloor \lceil f_b ^{-1}(a) \rce…

深入理解 JVM Class文件格式(九)

经过前八篇关于class文件的博客&#xff0c; 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中&#xff0c; 将会讲解关于方法的几个属性。 理解这篇博客的内容&#xff0c; 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有…

MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。什么场景下使用MongoDBMongoDB虽然是NoSQL(非关系型的数据库)&#xff0c;但是实际使用的时候可以当做关系型数据库来用&#xff0c;mysql等数据库中单表数据量…

#4604. The kth maximum number(整体二分 + 树套树)

#4604. The kth maximum number 给定一个大小不超过51055 \times 10 ^ 55105的矩形区域&#xff0c;有一些点有点权。 每次询问给定x1,y1,x2,y2,kx_1, y_1, x_2, y_2, kx1​,y1​,x2​,y2​,k问以x1,y1x_1, y_1x1​,y1​为右下角&#xff0c;x2,y2x_2, y_2x2​,y2​为左上角的…

深入理解 JVM Class文件格式(十)

到此&#xff0c; 所有关于class文件格式的重要内容都已经讲解完了&#xff0c; 不敢说面面俱到&#xff0c; 但是敢说大部分重要的内容都包含在内了。前前后后用了9篇博客来专门讲解class文件结构&#xff0c; 为什么花那么多的时间和精力来介绍class文件呢&#xff1f; 简而言…

《WTM送书活动:向更遥远的星辰大海起航~》

点击上方蓝字关注我们吧是的,没错~这一篇不是大老刘写的 哈哈~啥? 你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了...然后...后面请自行脑补~哎~生活还要继续鸭....那么,接下来由我陪大家唠一段儿~ 单口...各位看官老爷们:注意了!第一件事情呢我们的WTM框…

P4602 [CTSC2018]混合果汁(主席树)

P4602 [CTSC2018]混合果汁 共有nnn种果汁&#xff0c;第iii种果汁的美味度为did_idi​&#xff0c;每升价格为pip_ipi​&#xff0c;在一瓶混合果汁中&#xff0c;最多只能添加lil_ili​升。 有mmm个询问&#xff0c;每次询问给出两个数g,Lg, Lg,L&#xff0c;我们要找出价格…