有这么一道题:给出一颗树,以及点权,支持两种操作
- 单点修改
- 求两点之间的最短路上的所有点权和
数据范围1e5
我们可以dfs序建出一颗线段树,并且加一些括号,其中L[u]对应左括号,R[u]对应右括号,左括号为1,右括号为-1,那么求某点u到节点1的路上经过的节点的权值和就是求区间[1,L[u]]上的和。
对于单点修改,将u的点权改为w,就是线段树单点修改,将L[u]=w,R[u]=-w;
路径求u,v之间的点权和就是 ( 1 , L[u] )+( 1 , L[v] )-2*( 1 , [L[LCA(u,v)]] )+单点 L[LCA(u,v)] 的值。
没找到题测试,代码可能写的有问题2333。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
const int maxm=1e5+7;
struct Edge{
int v,w,next;
}edge[maxm];
int w[maxn];
int head[maxn],top;
void init(){
memset(head,-1,sizeof(head));
top=0;
}
void add(int u,int v,int w){
edge[top].v=v;
//edge[top].w=w;
edge[top].next=head[u];
head[u]=top++;
}
bool vis[maxn];
int dfn;
int L[maxn],R[maxn];
int b[maxn<<1];
int dep[maxn];
int fa[maxn][20];
void dfs(int u){
L[u]=++dfn;

这篇博客介绍了如何利用括号序和线段树解决树上最短路问题,包括单点修改和两点之间路径上点权和的求解方法。通过DFS序构建线段树,并用括号表示节点关系,可以高效计算路径上的权值和。文章提到了数据范围为1e5,并指出代码可能存在未测试的问题。
最低0.47元/天 解锁文章
2292

被折叠的 条评论
为什么被折叠?



