有这么一道题:给出一颗树,以及点权,支持两种操作
- 单点修改
- 求两点之间的最短路上的所有点权和
数据范围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