题目描述:
思路:
合并线段树
这里讲思路
首先它说要更改x到y的路径,我们不难想到树上差分,在x,y位置+1,在lca,fa(lca)位置-1,最后从下往上合并就行了
我们对每个点开一个权值线段树,记录救济粮,合并简单来说就是儿子对儿子,没儿子就抢过来。
c o d e code code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
int n, q, rex[MAXN], rey[MAXN], rez[MAXN], root[MAXN], cnt;
int L[MAXN], H[MAXN];
int head[MAXN], tot=1, f[MAXN][25], dep[MAXN];
struct node {
int to, next;
} edge[MAXN * 2];
struct SgT {
int l, r, maxx, ans;
#define l(p) tree[p].l
#define r(p) tree[p].r
#define maxn(p) tree[p].maxx
#define ans(p) tree[p].ans
}tree[MAXN * 100];
void add(int x, int y) {
edge[++tot] = (node){
y, head[x]};
head[x] = tot;
}
void dfs(int x, int fa) {
dep[x] = dep[fa] + 1, f[x][0] = fa;