HYSBZ1036 [ZJOI2008]树的统计(树链剖分)
将树通过树链剖分转化成线性序列,用线段树维护最值,和值即可。
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N = 3e4 + 10;
4 int n, m, head[N], to[N << 1], nxt[N << 1], tot;
5 int total, fa[N], dep[N], size[N], son[N], top[N];
6 int w[N], id[N], rev[N];
7 int Max, Sum;
8 struct node{
9 int mx, sum;
10 }t[N << 2];
11 void add(int x, int y) {
12 nxt[++ tot] = head[x]; head[x] = tot; to[tot] = y;
13 }
14 void dfs1(int u, int f) { //求dep,fa,size,son
15 size[u] = 1;
16 for (int i = head[u]; i; i = nxt[i]) {
17 int v = to[i];
18 if (v == f) continue;
19 dep[v] = dep[u] + 1;
20 fa[v] = u;
21 dfs1(v, u);
22 size[u] += size[v];
23 if (size[v] > size[son[u]]) son[u] = v;
24 }
25 }
26 void dfs2(int u, int t) { //求top,id,rev
27 top[u] = t;
28 id[u] = ++ total; // u对应的dfs序下标
29 rev[total] = u; // dfs序下标对应的u
30 if (!son[u]) return ;
31 dfs2(son[u], t);//先沿重儿子dfs
32 for (int i = head[u]; i; i = nxt[i]) {
33 int v = to[i];
34 if (v != fa[u] && v != son[u]) dfs2(v, v);
35 }
36 }
37 namespace SegmentTree {
38 #define mid ((l + r) >> 1)
39 #define lson k << 1, l, mid
40 #define rson k << 1 | 1, mid + 1, r
41 void pushup(int k) {
42 t[k].mx = max(t[k << 1].mx, t[k << 1 | 1].mx);
43 t[k].sum = t[k << 1].sum + t[k << 1 | 1].sum;
44 }
45 void build(int k, int l, int r) {
46 if (l == r) {
47 t[k].mx = t[k].sum = w[rev[l]];
48 return ;
49 }
50 build(lson), build(rson);
51 pushup(k);
52 }
53 void update(int k, int l, int r, int pos, int v) {
54 if (l == r) {
55 t[k].mx = t[k].sum = v;
56 return ;
57 }
58 if (pos <= mid) update(lson, pos, v);
59 else update(rson, pos, v);
60 pushup(k);
61 }
62 void query(int k, int l, int r, int L, int R) {
63 if (L <= l && R >= r) {
64 Max = max(Max, t[k].mx);
65 Sum += t[k].sum;
66 return ;
67 }
68 if (L <= mid) query(lson, L, R);
69 if (R > mid) query(rson, L, R);
70 }
71 void ask(int u, int v) {
72 while (top[u] != top[v]) {
73 if(dep[top[u]] < dep[top[v]]) swap(u, v);
74 query(1, 1, total, id[top[u]], id[u]);
75 u = fa[top[u]];
76 }
77 if (dep[u] > dep[v]) swap(u, v);
78 query(1, 1, total, id[u], id[v]);
79 }
80 }
81 using namespace SegmentTree;
82 int main() {
83 int x, y; char str[10];
84 scanf("%d", &n);
85 for (int i = 1; i < n; i ++) {
86 scanf("%d %d", &x, &y);
87 add(x, y), add(y, x);
88 }
89 for (int i = 1; i <= n; i ++) scanf("%d", &w[i]);
90 dep[1] = 1;
91 dfs1(1, 0);
92 dfs2(1, 1);
93 build(1, 1, total);
94 scanf("%d", &m);
95 for (int i = 1; i <= m; i ++) {
96 scanf("%s", str);
97 scanf("%d %d", &x, &y);
98 if(str[0] == 'C') update(1, 1, total, id[x], y);
99 else {
100 Sum = 0;
101 Max = -0x3f3f3f3f;
102 ask(x, y);
103 if (str[1] == 'M') printf("%d\n", Max);
104 else printf("%d\n", Sum);
105 }
106 }
107 return 0;
108 }
HYSBZ1036 [ZJOI2008]树的统计(树链剖分)的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- [ZJOI2008]树的统计——树链剖分
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- luoguP2590 [ZJOI2008]树的统计(树链剖分)
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
随机推荐
- Dubbo源码(四) - 服务引用(消费者)
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 上一篇文章,讲了Dubbo的服务导出: Dubbo源码(三) - 服务导出(生产者) 本文,咱们 ...
- 企业级数据治理工作怎么开展?Datahub这样做
大数据发展到今天,扮演了越来越重要的作用.数据可以为各种组织和企业提供关键决策的支持,也可以通过数据分析帮助发现更多的有价值的东西,如商机.风险等等. 在数据治理工作开展的时候,往往会有一个专门负责数 ...
- RSS订阅微信公众号初探-feed43
为什么用RSS,能怎么用RSS订阅微信公众号 建议信息聚合(Really Simple Syndication, RSS)在08年我第一次摸到自己家电脑时就给我留下了印象,当时还想这打开都啥玩意呀怎么 ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 金灿灿的季节 - Apache DolphinScheduler收获5位新Committer
在这个金灿灿的收获季节,经过 Apache DolphinScheduler PPMC 们的推荐和投票,Apache DolphinScheduler 收获了 5 位新Committer .他们是:n ...
- ceph 004 纠删码池 修改参数 cephx认证
复习ceph003 存储池为逻辑概念,存储池可以占用整个集群的所有空间 [root@ceph01 ~]# ceph osd pool create pool1 pool 'pool1' created ...
- Java学习--流程控制
Java学习 流程控制 用户交互Scanner Scanner对象 Java通过Scanner类获取用户的输入 基本语法: Scanner scanner = new Scanner(System.i ...
- Luogu2580 于是他错误的点名开始了 (Trie树)
复习\(Trie\),忘了用\(val[]\)表示每个节点权值,用\(vis[]\)水过了 #include <iostream> #include <cstdio> #inc ...
- 使用idea remote 开发体验
本地使用idea开发最不好的一个体验就是打开稍大的工程就非常的卡,怎么调参数都没用,现在idea推出了idea remote就赶紧来体验下. 使用方式 除了idea不需要额外下载什么包,但是因为rem ...
- 【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
问题描述 在App Service for Windows的环境中,当前只提供了PHP 7.4 版本的选择情况下,如何实现自定义PHP Runtime的版本呢? 如 PHP Version 8.1.9 ...