[ZJOI2008]树的统计

题目描述

一棵树上有 nnn 个节点,编号分别为 111 到 nnn,每个节点都有一个权值 www。

我们将以下面的形式来要求你对这棵树完成一些操作:

I. CHANGE u t : 把结点 uuu 的权值改为 ttt。

II. QMAX u v: 询问从点 uuu 到点 vvv 的路径上的节点的最大权值。

III. QSUM u v: 询问从点 uuu 到点 vvv 的路径上的节点的权值和。

注意:从点 uuu 到点 vvv 的路径上的节点包括 uuu 和 vvv 本身。

输入格式

输入文件的第一行为一个整数 nnn,表示节点的个数。

接下来 n−1n-1n−1 行,每行 222 个整数 aaa 和 bbb,表示节点 aaa 和节点 bbb 之间有一条边相连。

接下来一行 nnn 个整数,第 iii 个整数 wiw_iwi​ 表示节点 iii 的权值。

接下来 111 行,为一个整数 qqq,表示操作的总数。

接下来 qqq 行,每行一个操作,以 CHANGE u t 或者 QMAX u v 或者 QSUM u v 的形式给出。

输出格式

对于每个 QMAX 或者 QSUM 的操作,每行输出一个整数表示要求输出的结果。

输入输出样例

样例输入1

4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4

样例输出1

4
1
2
2
10
6
5
6
5
16

说明/提示

对于 100%100 \%100% 的数据,保证 1≤n≤3×1041\le n \le 3\times 10^41≤n≤3×104,0≤q≤2×1050\le q\le 2\times 10^50≤q≤2×105。

中途操作中保证每个节点的权值 www 在 −3×104-3\times 10^4−3×104 到 3×1043\times 10^43×104 之间。

Code

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast")
#include <bits/stdc++.h>
using namespace std;
const int N = 30005;
stack<int>s;
int n, m, q;
char ch[10];
struct lct
{int fa, c[2], rev, val, sm, mx;inline int &operator[] (int x){return c[x];}
} t[N];
void pushup(int x)
{int ls = t[x][0], rs = t[x][1];t[x].sm = t[ls].sm + t[rs].sm + t[x].val;t[x].mx = max(max(t[ls].mx, t[rs].mx), t[x].val);
}
void pushdown(int x)
{int ls = t[x][0], rs = t[x][1];if (t[x].rev)t[ls].rev ^= 1, t[rs].rev ^= 1,swap(t[x][0], t[x][1]), t[x].rev = 0;
}
bool pdrt(int x)
{return t[t[x].fa][0] != x && t[t[x].fa][1] != x;
}
void rotate(int x)
{int y = t[x].fa, z = t[y].fa, dy = (t[y][1] == x), dz = (t[z][1] == y);if (!pdrt(y))t[z][dz] = x;t[y][dy] = t[x][dy ^ 1], t[t[x][dy ^ 1]].fa = y;t[x][dy ^ 1] = y, t[y].fa = x, t[x].fa = z;pushup(y);
}
void splay(int x)
{s.push(x);for (int i = x; !pdrt(i); i = t[i].fa)s.push(t[i].fa);while (s.size())pushdown(s.top()), s.pop();while (!pdrt(x)){int y = t[x].fa;int z = t[y].fa;if (!pdrt(y))if (t[y][1] == x ^ t[z][1] == y)rotate(x);elserotate(y);rotate(x);}pushup(x);
}
void access(int x)
{for (int i = 0; x; x = t[x].fa)splay(x), t[x][1] = i, i = x;
}
void mkrt(int x)
{access(x), splay(x), t[x].rev ^= 1;
}
int main()
{scanf("%d", &n);t[0].mx = -99999;for (int i = 1, x, y; i < n; i++)scanf("%d%d", &x, &y), mkrt(x), t[x].fa = y;for (int i = 1; i <= n; i++)splay(i),scanf("%d", &t[i].val), pushup(i);scanf("%d", &q);while (q--){int x, y;scanf("%s%d%d", ch, &x, &y);if (ch[1] == 'H')splay(x),t[x].val = y, pushup(x);else if (ch[1] == 'M'){mkrt(x);access(y);splay(y);printf("%d\n", t[y].mx);}else{mkrt(x);access(y);splay(y);printf("%d\n", t[y].sm);}}return 0;
}

广告

绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/

绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/

(现在使用,人人均可获得300元大奖)

【一本通提高树链剖分】「ZJOI2008」树的统计相关推荐

  1. 【树链剖分】「ZJOI2008」树的统计

    前置知识 树链剖分的思想及能解决的问题 树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息. 具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息. 树链剖分(树 ...

  2. 【BZOJ4515】游戏,树链剖分+永久化标记线段树维护线段信息(李超线段树)

    Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 李超线段树 一开始听faebdc讲,并没有听的很懂ww 后来找到良心博文啊有木有 折越 首先可以把修改 ...

  3. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

  4. 计蒜客 - Distance on the tree(树链剖分+离线处理+线段树)

    题目链接:点击查看 题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数 题目分析:因为一开始不会主席 ...

  5. 【树链剖分】洛谷树(P3401)

    正题 P3401 题目大意 给你一棵树,让你进行以下操作 修改一条边的边权 查询一条路径的所有子路径异或值的和 解题思路 记下所有点到根节点的路径亦或值,那么查询就是所有点对的异或值之和 因为边权&l ...

  6. 【树链剖分】【线段树】树的统计(金牌导航 树链剖分-1)

    树的统计 金牌导航 树链剖分-1 题目大意 给出一棵树,让你做若干操作,操作如下: 1.修改一个节点的值 2.查询两个节点之间路径的最大值 3.查询两个节点之间路径的和 输入样例 4 1 2 2 3 ...

  7. 树链剖分入门+HYSBZ - 1036树的统计Count

    今天学习了树链剖分,记录一下. [题目背景] HYSBZ - 1036树的统计Count [题目分析] 题目要求求任意结点之间路径的和以及路径上最大的结点,还有可能修改.如果正常做可能会很复杂(我也不 ...

  8. 【YBT2023寒假Day1 B】不跪模样(树链剖分)(线段树)

    不跪模样 题目链接:YBT2023寒假Day1 B 题目大意 给你一棵有根数,点有点权,两种操作: 对于所有 x 子树内与 x 距离不超过 2 的点,将其点权加 v. 询问 x 子树中,满足 i< ...

  9. 【GDOI2016】疯狂动物城(树链剖分+可持久化线段树)

    码农题- 调了我三个晚上- 看来我的代码能力还是太弱了- 首先我们不难发现在u到v这条链的答案为∑i=1n(n−i)(n−i+1)ai2\sum_{i=1}^n\frac{(n-i)(n-i+1)a_ ...

最新文章

  1. kafka系列文章索引
  2. 安装cygwin时的一个长时间处理
  3. M| SQL 导入导出的时候数据库表的主键和自动编号丢失 怎么办
  4. LeetCode 第 25 场双周赛(718/1832,前39.2%)
  5. SpringBoot配置文件加密
  6. arraylist 的扩容机制_ArrayList详解
  7. 后浪“95”获 CVPR 2020 最佳论文,前得主这样解读
  8. Unity常用工具类
  9. 【学习笔记】数据分析师相关岗位招聘情况分析
  10. 雨滴win7计算机路径,Rainmeter雨滴桌面Win7打不开怎么办?
  11. 使用Python获取键盘的输入
  12. 计算机9针485接口,串口RS232__485的9针引脚定义
  13. android qq 邮箱格式,QQ邮箱格式是什么_QQ邮箱写法正确格式
  14. 世界上最著名也最危险的APT恶意软件清单
  15. 负整数补码的三种方法
  16. 手把手教你扩展个人微信号(2)
  17. Sql Server 生成 Word 文档 表结构
  18. 【Rust日报】 2019-01-26
  19. 数学建模 —— 多元回归分析
  20. SQL Server 修改表,不允许保存更改【解决办法】

热门文章

  1. maven插件之Dependency:analyze
  2. Android UI 设计笔记
  3. 微信公众号文章、菜单如何实现一键拨号?
  4. YOLOv5白皮书-第Y4周:common.py文件解读
  5. HTML5网页怎么花伞,幼儿园大班手工活动教案《花伞》
  6. Excel计算数值绝对值的2种操作方法
  7. C语言学习第九章——用户建立自己的数据类型
  8. VBA Word ParagraphFormat.FirstLineIndent
  9. 蛋白质试剂BHQ-3-CFn,bhq-1-SH-h DNA,BHQ-2,暗猝灭剂标记蛋白
  10. OKHTTP缓存max-age和max-stale详解