Upd G

看上好模板的样子, 果然是个模板题 好题 , 首先考虑这张图的 \(Euler \ Tour\), 简单点说, 就是dfs一遍, 把每个点入栈出栈顺序存起来, 举个例子·

2
1 2
2 3

这棵树的 \(Euler \ Tour\) 就是1 2 3 3 2 1

相当于把树拍成序列, 之后在上面记录每个点到根的距离。

操作一 改变某条边权值为 \(w\) 相当于把这条边上入栈顺序相对靠后的点(son) 的值 改为 \(w\) , 这个操作可以用树状数组/线段树维护。

操作二 统计答案 树上节点 \(u \ v\) 的距离 \(\operatorname{dis}(u, v) =\operatorname{dis}(1, u) + \operatorname{dis}(1, v) - 2 \times \operatorname{dis}(1, lca(u, v))\)

所以找出 $u\ v $ 的 \(lca\) 统计即可

\(Code\)

vector<int> G[maxn];
//LCA
int p[maxn][21];
int dep[maxn];
int in[maxn], out[maxn];
int T = 0;
void dfs(int u, int fa, int depth) {
dep[u] = depth; p[u][0] = fa;
in[u] = ++T;
for (int i = 1; i <= 20; i++) p[u][i] = p[p[u][i - 1]][i - 1];
for (int i = 0; i < G[u].size(); i++) if (G[u][i] != fa) dfs(G[u][i], u, depth + 1);
out[u] = ++T;
}
int LCA(int x, int y) {
if (dep[x] < dep[y]) swap(x, y);
for (int i = 20; i >= 0; i--) if(dep[p[x][i]] >= dep[y]) x = p[x][i];
if (x == y) return x;
for (int i = 20; i >= 0; i--) if (p[x][i] != p[y][i]) x = p[x][i], y = p[y][i];
return p[x][0];
}
int lf[maxn], rf[maxn];
int c[maxn], we[maxn];
void add(int x, int y) {
for (int i = x; i <= T; i += i & (-i)) {
c[i] += y;
}
return;
}
int sum(int x) {
int res = 0;
for (int i = x; i; i -= i &-i) {
res += c[i];
}
return res;
}
signed main() {
cin >> n;
rep_(i, 1, n - 1) {
int u, v, w;
cin >> u >> v >> w;
G[u].pb(v);
G[v].pb(u);
lf[i] = u, rf[i] = v, we[i] = w;
}
dfs(1, 0, 1);
for (int i = 1; i <= n - 1; i++) {
if (in[lf[i]] > in[rf[i]]) swap(lf[i], rf[i]);
add(in[rf[i]], we[i]);
add(out[rf[i]], -we[i]);
}
int q;
cin >> q;
rep_(i, 1, q) {
int opt, x, y;
cin >> opt >> x >> y;
if (opt == 1) {
add(in[rf[x]], -we[x] + y);
add(out[rf[x]], we[x] - y);
we[x] = y;
} else {
cout << sum(in[x]) + sum(in[y]) - 2 * sum(in[LCA(x, y)]) << endl;
}
}

abc294G的更多相关文章

随机推荐

  1. tomcat8.5.55启动失败service tomcat start 报错

    问题描述: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these e ...

  2. 【C++小程序】《我要抽签》b1.0做好了~

    也许是的,得横空出世了 如你所见 这款基于\(C++\)能模仿Mrs. Yao抽签系统的cpp终于做完了啦~ 初期功能很少.\(BUG\)极多. 所以为了您的体验:) 请遵守格式 代码: #inclu ...

  3. STM32F103使用FSMC对接正点原子3.5寸TFTLCD屏幕

    fsmc的使用算是32里面有点绕的一个知识点,但是想明白了其实也没啥了. 首先我先放32个0在这儿: 0000  0000  0000  0000  0000  0000  0000  0000 [3 ...

  4. spring java枚举转json 方便前端取值

    未处理前: "gender":"GenderEnum.FEMALE(code=2, gender=女)" 解决方法:使用jackson提供的注解 @JsonFo ...

  5. java实现前n项和,要求不使用循环、乘除法、判断标识

    public class Ceui3 { public static int sum = 0; public static void main(String[] args) { System.out. ...

  6. SAP B1 增加或删除单据,或者是新增修改BOM清单,报错‘出现内部错误时’,一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行检查SQL代码,一般就能发现错误所在。

    SAP B1 增加或删除单据,或者是新增修改BOM清单,报错'出现内部错误时',一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行 ...

  7. zyb

  8. centos7所有用户循环登录

    1 使用快捷键Ctrl+Alt+F2进入命令终端 2 输入账号密码 3 输入 /usr/bin/sudo 4 输入 startx 那种单用户,改配置的试了没有用

  9. 快速乘_c/c++

    快速乘的使用主要是这种情形:要计算(a * b) % p时,发现a * b爆 long long 了,而a, b, p没有爆 long long   快速乘的原理:   比如当我们需要要计算3 * 2 ...

  10. Word 找不到 Endnote选项

    Word 2010 找不到 Endnote选项汇总(不是Office有效加载项)因为基本百度上的问题我全都遇到了-说明:在我们使用Word的过程中,常常发现没有Endnote选项.然后去找百度方法:1 ...