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 ...
随机推荐
- 老子云携手福昕鲲鹏,首次实现3D OFD三维版式文档的重大突破
你见过能动起来的文档吗? 这可不是动图,也不是视频,而是可以直接自由交互3D模型的3D OFD文档! OFD可能有人不熟悉,它其实是国产"PDF",3D OFD则突破了以往文字.图 ...
- 简短截说阐述redis中事务的使用
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_127 我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操 ...
- Docker 好用的镜像
Docker 官方镜像 1.个人博客空间wordpress 2.开源管理系统odoo 3.开发文档生成工具star7th/showdoc.(启动说明文档https://www.showdoc.com. ...
- 从-99打造Sentinel高可用集群限流中间件
接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...
- WPF开发随笔收录-WriteableBitmap绘制高性能曲线图
一.前言 之前分享过一期关于DrawingVisual来绘制高性能曲线的博客,今天再分享一篇通过另一种方式来绘制高性能曲线的方法,也就是通过WriteableBitmap的方式:具体的一些细节这里就不 ...
- MySQL8.0错误日志Error log
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 理论知识 错误日志内容 错误日志包含mysqld启动和关闭的时间信息,还包含诊断消息,如服务器启动和关闭期间以及服务器运行 ...
- MES对接Simba实现展讯平台 IMEI 写号与耦合测试
文章开始之前,必须对Simba工具点一个大大的赞,Simba为了适应市面上不同厂家开发的 MES 系统,特地开发了统一的接口,各个 MES 厂家只需要按照接口规范去做开发,然后将中间件加载到 Simb ...
- 最新豆瓣top250爬虫案例代码分析[注释齐全]
导入包 # json包 import json #正则表达式包 import re import requests from requests import RequestException 定义爬取 ...
- Luogu[YNOI2019]排序(DP,线段树)
要最优?就要一步到位,不能做"马后炮",走"回头路",因此将序列映射到一个假定最优序列,发现移动原序列等价于删除原序列元素,以便生成最大不下降子序列.可线段树维 ...
- Redis 19 整合SpringBoot
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 Spri ...