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. PTA两个有序链表序列的合并

    本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义:   List Merge( List L1, List L2 );   其中List结构定义如下:   ...

  2. 冲刺总结-day7

    完成任务:前端设计 设计系统前端,利用html和css对登录页面和进入系统操作界面进行界面化设计,使系统看起来美观.简洁. 一.设计思路 利用HTML对整个网页页面进行布局和设计内容,使用CSS对每一 ...

  3. applicationContext使用注解代替

    创建一个类SpringConfig @Configuration//证明这个类是spring的配置文件类 @ComponentScan("com.itheima")//扫描的哪些包 ...

  4. DBeaver通过phoenix连接云主机的hbase

    准备 1.云主机上已经安装好jdk.hadoop.hbase.zookeeper.phoenix,并且在主机上测试连接成功.可参考 https://blog.csdn.net/shangxindeku ...

  5. python开头

    python识别的正则模式 coding[:=]\s*([-\w.]+)#coding:utf8   ???不要用 #coding=utf-8#coding:utf-8# -*- coding: ut ...

  6. java 循环删除数据写法

    import java.util.ArrayList;import java.util.ConcurrentModificationException;import java.util.List;// ...

  7. 初识MPC

    MPC调研报告 ​ 这是一篇关于MPC的调研报告,主要介绍了我对MPC领域的一些基础认识.全文按照这样的方式组织:第一节我介绍了什么是MPC以及MPC的起源:第二节介绍了MPC领域常用的一些符号和安全 ...

  8. Swagger UI教程 API 文档神器 搭配Node使用 web api 接口文档 (转)

    http://www.68idc.cn/help/makewebs/qitaasks/20160621620667.html 两种方案 一.Swagger 配置 web Api 接口文档美化 二.通过 ...

  9. sql自学记录

    复习 SQL join :用于根据两个或多个表中的列之间的关系,从这些表中查询数据 eg: SELECT Persons.LastName, Persons.FirstName, Orders.Ord ...

  10. List<dto> 转List<map>

    /** * list<DTO> 转 list<Map<String,Object>> * * @param list * @param <T> * @r ...