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 ...
随机推荐
- 选择语句-IF和标准if-else语句以及if-else语句的扩展
第二章 判断语句 2.1 判断语句1--if if语句的第一种格式:if if(关系表达式){ 语句体; } 执行流程 首先判断关系表达式看起结果是true还是false 如果是true就执行与具体 ...
- python不同平台进程的启动与终止
Liunx进程的启动与终止 在使用subprocess创建进程时需要将所有进程设置为一个进程组 preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object ...
- CF Edu Round 131 简要题解 (ABCD)
A 分类讨论即可 . using namespace std; typedef long long ll; typedef pair<int, int> pii; int main() { ...
- Jmix- 业务系统高效开发的新方式
企业在数字化转型的过程中,都面临将现有的业务流程进行"软件化"的过程.然而,在我们的印象中,通常会觉得针对业务系统的软件开发不是特别高效.这背后有很多原因,从开发角度看,有一个主要 ...
- 聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_175 分片上传并不是什么新概念,尤其是大文件传输的处理中经常会被使用,在之前的一篇文章里:python花式读取大文件(10g/50 ...
- C# 发送Http请求,传文件和其他参数
/// <summary> /// httpWebRequest post by dic /// </summary> /// <param name="url ...
- Java学习(三)Java起源&发展
目录 Java的诞生 C&C++ Java初生 Java发展(三高: 高可用,高性能,高并发) Java特性和劣势 Java程序运行机制 Java的诞生 C&C++ **1972年 ...
- PKUSC 2022 口胡题解
\(PKUSC\ 2022\)口胡题解 为了更好的在考试中拿分,我准备学习基础日麻知识(为什么每年都考麻将 啊啊啊) 首先\(STO\)吉老师\(ORZ,\)真的学到了好多 观察标签发现,这套题覆盖知 ...
- Fishhole类定义和实现
当眼睛处于水中,产生类似的鱼眼视角,fov永远是psi_max的2倍.具体算法参考书籍. 类声明: #pragma once #ifndef __FISHHOLE_HEADER__ #define _ ...
- 10大python加速技巧
简介 目前非常多的数据竞赛都是提交代码的竞赛,而且加入了时间的限制,这就对于我们python代码的加速非常重要.本篇文章我们介绍在Python中加速代码的一些技巧.可能不是很多,但在一些大的循环或者函 ...