【BZOJ1036】【树链剖分】树的统计Count

Description

一 棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身

Input

输 入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数 q,表示操作的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。 对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到 30000之间。

Output

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

Sample Input

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

Sample Output

4
1
2
2
10
6
5
6
5
16

HINT

Source

树的分治

【分析】

SB题,不说了。

  1 /*
  2 唐代李白
  3 《南陵别儿童入京》
  4 白酒新熟山中归,黄鸡啄黍秋正肥。
  5 呼童烹鸡酌白酒,儿女嬉笑牵人衣。
  6 高歌取醉欲自慰,起舞落日争光辉。
  7 游说万乘苦不早,著鞭跨马涉远道。
  8 会稽愚妇轻买臣,余亦辞家西入秦。
  9 仰天大笑出门去,我辈岂是蓬蒿人。
 10 */
 11 #include <iostream>
 12 #include <cstdio>
 13 #include <algorithm>
 14 #include <cstring>
 15 #include <vector>
 16 #include <utility>
 17 #include <iomanip>
 18 #include <string>
 19 #include <cmath>
 20 #include <queue>
 21 #include <assert.h>
 22 #include <map>
 23 #include <ctime>
 24 #include <cstdlib>
 25 #include <stack>
 26 #define LOCAL
 27 const int INF = 0x3f3f3f3f;
 28 const int MAXN = 100000  + 10;
 29 const int maxnode = 1000000;
 30 const int maxm= 30000 * 2 + 10;
 31 using namespace std;
 32 struct Node{
 33        int l, r;
 34        int Max, sum;
 35        Node *ch[2];
 36 }*root, mem[maxnode];
 37 struct Edge{
 38        int u, v;
 39 }edge[MAXN];
 40 
 41 int n, top[MAXN], fa[MAXN];
 42 int dep[MAXN], size[MAXN], son[MAXN];
 43 int head[MAXN], next[MAXN], to[MAXN];
 44 int pos[MAXN], Time, M, tot;
 45 
 46 void dfs_1(int u){
 47      size[u] = 1;
 48      son[u] = 0;
 49      for (int i = head[u]; i != -1; i = next[i]){
 50          int v = to[i];
 51          if (v == fa[u]) continue;
 52          fa[v] = u;
 53          dep[v] = dep[u] + 1;
 54          dfs_1(v);
 55          size[u] += size[v];
 56          if (size[v] > size[son[u]]) son[u] = v;
 57      }
 58 }
 59 //标号 
 60 void dfs_2(int u, int top_node){
 61      top[u] = top_node;
 62      pos[u] = ++Time;//这里就不是代表边了,而是点
 63      if (son[u]) dfs_2(son[u], top_node);
 64      
 65      for (int i = head[u]; i != -1; i = next[i]){
 66          int v = to[i];
 67          if (v == fa[u] || v == son[u]) continue;
 68          dfs_2(v, v);
 69      } 
 70 }
 71 void addEdge(int u, int v){
 72      to[M] = v;
 73      next[M] = head[u];
 74      head[u] = M++;
 75 }
 76 Node *NEW(int l, int r){
 77      Node *p = &mem[tot++];
 78      p->l = l;
 79      p->r = r;
 80      p->Max = p->sum = 0;
 81      return p;
 82 }
 83 //连区间修改都没有 
 84 void update(Node *&t){
 85      if (t->l == t->r) return;
 86      t->Max = max(t->ch[0]->Max, t->ch[1]->Max);
 87      t->sum = t->ch[1]->sum + t->ch[0]->sum; 
 88 }
 89 void build(Node *&t, int l, int r){
 90      if (t == NULL){
 91         t = NEW(l, r);
 92      }
 93      if (l == r) return;
 94      int mid = (l + r) >> 1;
 95      build(t->ch[0], l, mid);
 96      build(t->ch[1], mid + 1, r);  
 97 }
 98 void change(Node *&t, int l, int x){
 99      if (t->l == l && t->r == l){
100         t->sum = t->Max = x;
101         return;
102      }
103      int mid = (t->l + t->r) >> 1;
104      if (l <= mid) change(t->ch[0], l, x);
105      else change(t->ch[1], l, x);
106      
107      update(t); 
108 }
109 void init(){
110      memset(dep, 0, sizeof(dep));
111      memset(head, -1, sizeof(head));
112      
113      M = Time = tot = 0;
114      scanf("%d", &n);
115      for (int i = 1; i < n; i++){
116          scanf("%d%d", &edge[i].u, &edge[i].v);
117          addEdge(edge[i].u, edge[i].v);
118          addEdge(edge[i].v, edge[i].u);
119      }
120      fa[1] = 0;
121      size[0] = 0;
122      
123      dfs_1(1);
124      dfs_2(1, 1);
125      root = NULL;
126      build(root, 1, Time);
127      //因为不是边所以跟父亲没什么关系,不用对边进行更新 
128      for (int i = 1; i <= n; i++){
129          int t;
130          scanf("%d", &t);
131          change(root, pos[i], t);
132      }
133      //printf("%d\n", root->Max);
134 }
135 int query_sum(Node *&t, int l, int r){
136     if (l <= t->l && t->r <= r) return t->sum;
137     int mid = (t->l + t->r) >> 1;
138     int cnt = 0;
139     if (l <= mid) cnt += query_sum(t->ch[0], l, r);
140     if (r > mid) cnt += query_sum(t->ch[1], l, r);
141     return cnt;
142 }
143 int query_max(Node *&t, int l, int r){
144     if (l <= t->l && t->r <= r) return t->Max;
145     int mid = (t->l + t->r) >> 1;
146     int Ans = -INF;
147     if (l <= mid) Ans = max(Ans, query_max(t->ch[0], l, r));
148     if (r > mid) Ans = max(Ans, query_max(t->ch[1], l, r));
149     return Ans;
150 }
151 int QMAX(int l, int r){
152      int Ans = -INF;
153      while (top[l] != top[r]){
154            //低的往上爬 
155            if (dep[top[l]] < dep[top[r]]) swap(l, r);
156            Ans = max(Ans, query_max(root, pos[top[l]], pos[l]));
157            l = fa[top[l]];
158      }
159      //if (l == r) return Ans;
160      if (dep[l] > dep[r]) swap(l, r);
161      Ans = max(Ans, query_max(root, pos[l], pos[r]));
162      return Ans;
163 }
164 int QSUM(int l, int r){
165      int sum = 0;
166      while (top[l] != top[r]){
167            //低的往上爬 
168            if (dep[top[l]] < dep[top[r]]) swap(l, r);
169            sum += query_sum(root, pos[top[l]], pos[l]);
170            l = fa[top[l]];
171      }
172      //if (l == r) return sum;
173      if (dep[l] > dep[r]) swap(l, r);
174      sum += query_sum(root, pos[l], pos[r]);
175      return sum;
176 }
177 void work(){
178      int q;
179      scanf("%d", &q);
180      for (int i = 1; i <= q; i++){
181          char str[10];
182          scanf("%s", str);
183          if (str[0] == 'C'){
184             int l, x;
185             scanf("%d%d", &l, &x);
186             change(root, pos[l], x);
187          }else{
188                if (str[1] == 'M'){
189                   int l, r;
190                   scanf("%d%d", &l, &r);
191                   printf("%d\n", QMAX(l, r));
192                }else{
193                   int l, r;
194                   scanf("%d%d", &l, &r);
195                   printf("%d\n", QSUM(l, r));
196                }
197          }
198      }
199 }
200 
201 int main(){
202     int T;
203     
204     init();
205     work();
206     return 0;
207 }
View Code

 

转载于:https://www.cnblogs.com/hoskey/p/4341386.html

Allegro172版本多人协同在线设计操作指导 首先用户需要在同一个局域网下,并且Allegro172的版本必须一致,比如都是S082的版本。另外一个用户同样打开相同版本的172,选择Symphony Team design。Allegro升级到172版本,可以支持多人协同设计,并且实时同步,具体操作如下。协同模式下,不能直接保存文件,需要另存版本,注意时常保存文件,以免丢失数据。第一个用户打开PCB,选择Symphony Team design。等待一会出现如下窗口,表示已经共享成功了,并且记下IP地址。出现一个窗口,输出开共享用户的IP地址。 阅读详情

相关推荐

微信小程序使用ucharts折线图,有负数显示0刻度线

当数据有负数和正数的时候默认不会显示0刻度线,不方便看出正负对比。

欢迎来到我的博客!在这里,我将分享我在前端开发方面的知识和经验。让我们一起探索前端开发的无限可能! 1579

bzoj 1036 //1036: [ZJOI2008]树的统计Count 树链剖分

bzoj 1036 //1036: [ZJOI2008]树的统计Count 树链剖分 bzoj 1036 //1036: [ZJOI2008]树的统计Count //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1036 更多题解,详见https://blog.youkuaiyun.com/mrcrack/article/de...

mrcrack的博客 282

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

[BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分

树链剖分  简单来说就是数据结构在树上的应用。常用的为线段树splay等。(可现在splay还不会敲囧)   重链剖分:     将树上的边分成轻链和重链。     重边为每个节点到它子树最大的儿子的边,其余为轻边。     设(u,v)为轻边,则size(v)<=size(u)/2 (一旦大于了那必然是重边)     也就是一条路径上每增加一条轻边节点个数就会减少一半以...

weixin_30700977的博客 136

《机器学习》周志华_自学记录

第一章绪论## 1.1引言机器学习所研究的主要内容,是关于在计算机上从数据中产生"模型"(model)的算法,即"学习算法"(learning algorithm).在面对新的情况时(例如看到一个没剖开的西瓜),模型会给我们提供相应的判断(例如好瓜).如果说计算机科学是研究关于"算法"的学问,那么类似的,可以说机器学习是研究关于"学习算法"的学问.## 1.2基本术语:用于预测离散值,例如将样本分为“好瓜”或“坏瓜”。:用于预测连续值,例如西瓜的成熟度(如0.95、0.37)。

2201_75296678的博客 2530

MRI图像切片(nii格式转2D)

代码参考:将一个MRI(nii格式)数据进行切片 想要批量抽取MRI数据的几个切片,借鉴了上述代码的Python版本,原始代码抽取了全部切片。本次实验主要是抽取sMRI的横断面(axial)方向的其中30张切片,数量根据自己需求可自行设置。 import scipy, numpy, shutil, os, nibabel import sys, getopt import imageio def niito2D(filepath): inputfiles = os.listdir(filep

chs_502的博客 7548

【BZOJ 1036】树的统计Count(树链剖分)

【BZOJ 1036】树的统计Count(树链剖分)1036: [ZJOI2008]树的统计CountTime Limit: 10 Sec  Memory Limit: 162 MBSubmit: 12991  Solved: 5233Description  一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t

ACMer' 1056

从零构建Elasticsearch MCP代理:自然语言查询背后的技术揭秘

本文深入解析如何从零构建Elasticsearch MCP代理,实现自然语言查询的技术架构与实战应用。通过MCP协议与Elasticsearch的结合,系统能够将自然语言转换为精确的DSL查询,提升非技术用户的数据查询效率。文章详细介绍了核心架构、DSL生成引擎、端到端系统搭建及生产环境最佳实践,为开发者提供全面的技术指南。

lll78的博客 875

BZOJ 1036: [ZJOI2008]树的统计Count【树链剖分】

1036: [ZJOI2008]树的统计Count 【题目描述】 传送门 【题解】 裸的树链剖分。 代码如下 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 30...

aiweiluan5095的博客 157

网络分析工具Wireshark系列专栏:01-专栏导读

随着人工智能技术的普及,越来越多的博主开始利用AI进行内容创作,导致优快云等平台上充斥着大量低质量的洗稿文章,严重影响了技术软文的质量和可信度。为了应对这一现象,提升技术内容的质量,瑞哥决定推出系列技术专栏,为大家带来系统、深入且高质量的技术学习资源。这些专栏将帮助读者从入门到精通,特别适合习惯通过文档学习的技术爱好者。作为首个专栏,我们将聚焦于Wireshark——一款广受欢迎的网络协议分析工具。根据优快云后台的反馈,许多读者表示Wireshark是他们欠缺的一项技能。因此,本专栏将通过精心设计的课程

网络技术联盟站 357

ICP-10111气压传感器原理图设计,已量产(压力传感器)

在最近的室内导航定位项目中,我们需要一款能捕捉厘米级垂直高度变化的气压传感器 —— 毕竟室内环境里,哪怕是单个台阶的高度差都得精准识别。对比了几款器件后,最终选定了 ICP-10111:它 ±1Pa 的压差精度刚好能把高度差分辨到 8.5cm,0.4Pa 的低压力噪声能让数据输出足够稳定,再加上 0.5Pa/℃的低温漂特性,长期工作的可靠性也能满足需求。下面聊聊这套适配 ICP-10111 的硬件电路设计细节。

不脱发的程序猿 333

BZOJ1036 树的统计Count(树链剖分+线段树)

BZOJ1036 树的统计Count(树链剖分+线段树) 题目大意 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路...

FLY_WHITE的博客 273

2023推免(夏令营+套实验室)面试总结(博文附问题汇总和参考答案)

2023推免(夏令营+套实验室)面试总结(博文附问题汇总和参考答案)

m0_51339444的博客 1804

树链剖分+线段树 bzoj1036 树的统计Count

传送门:点击打开链接 题意:节点更新,路径求最大值以及求和。 思路:树链剖分,要注意单点更新和边更新的区别。然后就是在建线段树的时候,应该是用重新编号的新编号去建立的,刚开始一直没注意这个地方,然后调bug也调不出来,后来看了好久才看出来,以后还真要注意一下。 #include #define fuck(x) cout<<"["<<x<<"]" #define FIN freopen("in

qwb的博客 845

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

BZOJ - 1036 [ZJOI2008]树的统计Count 树链剖分入门

[ZJOI2008]树的统计Count escription   一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从...

diangan7073的博客 135

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

BZOJ 1036 树的统计 Count 树链剖分

题目大意:一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 n

世界 1328

BZOJ 1036 树的统计Count 树链剖分+线段树

https://www.lydsy.com/JudgeOnline/problem.php?id=1036   一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I II. QSUM u v: 询问从点u到点v...

xiji333的博客 204

BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分)

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1036         BZOJ太可怕了,第一页按照AC数排序,除了A+B,第一个就是这题了。。。。看着题目懵逼了很久,不知道怎么做,搜了一发题解,才发现是树链剖分。然而树链剖分这个名词也只是停留在听说过的程度,于是跟着一个大神的博客看了一下午才看懂,然后照着博客打了一次,但是一直是WA。索性

xtttgo的博客 406

BZOJ 1036 树的统计Count 树链剖分

题目大意: 给出一棵树, 3种操作 1.询问u到v路径上的最大点权 2.询问u到v路径上的点权和 3.修改i点权值为w 大致思路: 树链剖分练习题第5道...很水 树链剖分之后用线段树维护区间最大值和区间和即可, 单点修改区间查询 代码如下: Result  :  Accepted     Memory  :  4356 KB     Time  :  2468

Gatevin的专栏 632

[Bzoj1036][ZJOI2008]树的统计Count(树链剖分)

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分的板子题,在bzoj上做到就当复习啦 1 #include<bits/stdc++.h> 2 #define lson l,mid,i<<1 3 #define rson mid+1,r,i<<1|1 4 u...

weixin_30525825的博客 90

【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分

【BZOJ1036】[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注...

weixin_30294021的博客 74

bzoj1036: [ZJOI2008]树的统计Count——树链剖分

bzoj1036: [ZJOI2008]树的统计Count:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 M [Submit][Status][Discuss] Description

hahaAll的博客 615

BZOJ 1036: [ZJOI2008]树的统计Count 树链剖分

Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 Input 输入的...

Top_xiao的博客 194

bzoj 1036 [ZJOI2008]树的统计Count 题解(树链剖分)

原题链接: 洛谷:点我QωQ bzoj:点我QωQ 题意简述 仍然很模板。。。 给一个树,要支持三种操作:路径求最大,路径求和,单点修改。 数据 输入 先是一个正整数nnn和接下来n−1n-1n−1行每行两个数u,vu,vu,v表示uuu到vvv有一个边。 然后一行nnn个正整数,第iii个表示点iii的初始权值。 然后有一个正整数qqq,表示操作个数。 接下来qqq行每行描述一个操作。 操作有三...

LightningUZ的博客 290

[BZOJ1036][ZJOI2008]树的统计Count(树链剖分)

乱世繁华,只为你倾尽天下;苍水蒹葭,只为你归田卸甲。

zyf2000 1072

kyeremal-bzoj1036[ZJOI2008]-树的统计count-树链剖分

bzoj1036[ZJOI2008]-树的统计count 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7567  Solved: 3109 [Submit][Status][Discuss] Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个

kyeremal的专栏 742

树链剖分教程 & bzoj 1036 [ZJOI2008] 树的统计 Count 题解

【原题】 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4465  Solved: 1858 [Submit][Status] Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. C

阿蒋的专栏 6843
上一篇: 【POJ3237】【树链剖分】Tree
下一篇: 【HDU4010】【LCT】Query on The Trees
Gregory99174
博客等级 码龄10年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值