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

【题目描述】

一棵树上有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,表示节点的个数。接下来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之间。

【输出格式】

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

【样例输入】

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

【样例输出】

4

1

2

2

10

6

5

6

5

16

【题目分析】

这个题大意就是:给定一棵树,要求其支持单点修改,路径查询最大值和,路径求和。

这个就是典型树链剖分板题了,用线段树维护重链信息,对于单点修改就直接在线段树中修改,对于路径询问直接在线段树上进行区间查询即可。

【代码(已更新)】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e4+10;struct node{int y,next;
}edge[MAXN<<1];int head[MAXN];
int dfn[MAXN],son[MAXN],depth[MAXN],fa[MAXN],siz[MAXN],a[MAXN];
int l,x,y,n,q,tot;
char s[10];
int rec[MAXN],top[MAXN];void add(int x,int y)
{l++;edge[l].y=y;edge[l].next=head[x];head[x]=l;
}void dfs1(int x,int f)
{fa[x]=f;son[x]=0;siz[x]=1;for(int i=head[x];i!=-1;i=edge[i].next){int v=edge[i].y;if(v!=f){depth[v]=depth[x]+1;dfs1(v,x);siz[x]+=siz[v];if(siz[son[x]]<siz[v])son[x]=v;}}
}void dfs2(int x,int tp)
{top[x]=tp;dfn[x]=++tot;rec[dfn[x]]=x;if(son[x]) dfs2(son[x],tp);for(int i=head[x];i!=-1;i=edge[i].next){int v=edge[i].y;if(v!=fa[x]&&v!=son[x])dfs2(v,v);}
}
struct point{int l,r,sum,maxx;
}tr[4*MAXN];void push_up(int root)
{tr[root].sum=tr[root<<1].sum+tr[root<<1|1].sum;tr[root].maxx=max(tr[root<<1].maxx,tr[root<<1|1].maxx);
}void build(int root,int l,int r)
{tr[root].l=l;tr[root].r=r;if(l==r){tr[root].sum=tr[root].maxx=a[rec[l]]; return ;}int mid=l+r>>1;build(root<<1,l,mid);build(root<<1|1,mid+1,r);push_up(root);
}void update(int root,int x,int y)
{if(tr[root].l==x&&tr[root].r==x){tr[root].sum=tr[root].maxx=y;return ;}int mid=tr[root].l+tr[root].r>>1;if(x<=mid) update(root<<1,x,y);if(x>mid) update(root<<1|1,x,y);push_up(root);
}int querymax(int root,int l,int r)
{if(tr[root].l==l&&tr[root].r==r)return tr[root].maxx;int mid=tr[root].l+tr[root].r>>1;if(r<=mid) return querymax(root<<1,l,r);if(l>mid) return querymax(root<<1|1,l,r);if(l<=mid&&r>mid){int s1=querymax(root<<1,l,mid);int s2=querymax(root<<1|1,mid+1,r);return max(s1,s2);}
}int querysum(int root,int l,int r)
{if(tr[root].l==l&&tr[root].r==r)return tr[root].sum;int mid=tr[root].l+tr[root].r>>1;if(r<=mid) return querysum(root<<1,l,r);if(l>mid) return querysum(root<<1|1,l,r);if(l<=mid&&r>mid){int s1=querysum(root<<1,l,mid);int s2=querysum(root<<1|1,mid+1,r);return s1+s2;}
}int findmax(int x, int y)
{int f1=top[x],f2=top[y],ret=-0x3f3f3f3f;while(f1!=f2){if(depth[f1]<depth[f2]){swap(f1,f2);swap(x,y);}ret=max(ret,querymax(1,dfn[f1],dfn[x]));x=fa[f1],f1=top[x];}if(x==y) return max(ret,querymax(1,dfn[x],dfn[x]));if(depth[x]>depth[y]) swap(x,y);return max(ret,querymax(1,dfn[x],dfn[y]));
}int findsum(int x,int y)
{int f1=top[x],f2=top[y],ret=0;while(f1!=f2){if(depth[f1]<depth[f2]){ swap(f1,f2);swap(x,y);}ret+=querysum(1,dfn[f1],dfn[x]);x=fa[f1],f1=top[x];}if(x==y) return ret+querysum(1,dfn[x],dfn[y]);if(depth[x]>depth[y]) swap(x,y);return ret+querysum(1,dfn[x],dfn[y]);
}int main()
{scanf("%d",&n);memset(head,-1,sizeof(head));for(int i=1;i<n;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}for(int i=1;i<=n;i++) scanf("%d",&a[i]);dfs1(1,0);dfs2(1,1);build(1,1,n);scanf("%d",&q);while(q--){scanf("%s%d%d",s,&x,&y);if(s[0]=='C')  update(1,dfn[x],y); if(s[0]=='Q'&&s[1]=='M') printf("%d\n",findmax(x,y));if(s[0]=='Q'&&s[1]=='S') printf("%d\n", findsum(x,y));}return 0;
}

 

转载于:https://www.cnblogs.com/Ishtar/p/10010829.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity插件Gaia使用介绍

零基础创建Unity精美场景地形&#xff08;使用插件Gaia&#xff09;一、先上最终效果图二、软件环境搭建1.Unity5.6.0下载链接https://unity3d.com/cn/get-unity/download/archive?_ga2.110664517.1175563345.1516068066-173539005.15020707552.Gaia Unity地形制作插件下载链…

java http 压缩_解压HTTP API的GZIP压缩数据

1.对Java后端的请求HttpURLConnection对象中的消息头设置压缩connection.setRequestProperty("Accept-Encoding", "gzip, deflate");2.发送请求后获取response中的content-encodingconnection.getContentEncoding(); // 获取content-encoding3.如果content…

20151208_使用windows2012配置weblogic节点管理器

经过实践&#xff0c;weblogic节点管理器的作用主要有两点&#xff1a; 1、可通过weblogic控制台远程控制被管server启停。 2、可以自动重启被管server的进程&#xff0c;并且对spring框架提供比直接启动更快的重启速度。 配置步骤&#xff1a; 在管理电脑上&#xff1a; …

python各种包安装顺序_史上最全的Python包管理工具:Anaconda教程

事实上Anaconda 和 Jupyter notebook已成为数据分析的标准环境。简单来说&#xff0c;Anaconda是包管理器和环境管理器&#xff0c;Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中。接下来我详细介绍下Anaconda&#xff0c;并在最后给出Jupyter no…

在Spring MVC中使用多个属性文件

每个人都听说过将单个Web应用程序组合成一个大型应用程序的门户。 门户软件的工作原理类似于mashup &#xff0d;来自多个来源的内容在单个服务中被拾取&#xff0c;大部分显示在单个网页中。 门户软件还允许在嵌入到门户软件中的所有单个Web应用程序&#xff08;独立模块&…

汇编语言实验一

实验任务 &#xff08;1&#xff09;使用debug&#xff0c;将程序段写入内存&#xff0c;逐条执行&#xff0c;观察cpu中相关寄存器内容变化。 完成此实验&#xff0c;可用e命令或a命令。 e命令改写内存的内容&#xff0c;如图&#xff1a; 我没有一气喝成&#xff0c;一开始便…

python学习 day6 (3月7日)

#__author : liuyang #date : 2019/3/7 0007 a [a , b , c] b [] print(a is b ) # 空元组 可以 空列表 不可以 print(tuple(a))题目&#xff1a; l1 [11, 22, 33, 44, 55] #将此列表索引为奇数的对应元素全部删除 # 错误示例 for l in range(len(l1)):print(l)if l % 2…

java jni helloword_JNI入门教程之HelloWorld篇

JNI入门教程之HelloWorld篇来源:互联网 宽屏版 评论2008-05-31 09:07:11本文讲述如何使用JNI技术实现HelloWorld&#xff0c;目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。java Native Interface(JNI)是Java语言的本地编程接口&#xff0c;是J2SDK的一部分。在java…

centos7 python3安装numpy_centos 7 下安装numpy、scipy等python包

本文适用于刚入门的小白&#xff0c;欢迎大牛们批评指正。因为要开始数据分析&#xff0c;而python又不像R和matlab那么简洁。需要安装的包很多~网上找了好多牛人博客&#xff0c;想在centos7下安装numpy&#xff0c;scipy等包&#xff0c;一开始就懵逼了&#xff0c;网上的指导…

11、Node.js 函数

内容&#xff1a;普通函数&#xff0c;匿名函数&#xff0c;函数传递是如何让HTTP服务器工作的 ###普通函数例子&#xff1a; function say(word) {console.log(word); } function execute(someFunction, value) {someFunction(value); } execute(say, "Hello"); ###…

休眠事实:集成测试策略

我喜欢集成测试&#xff0c;这是检查Hibernate生成哪些幕后花絮的SQL查询的好方法。 但是集成测试需要运行的数据库服务器&#xff0c;这是您必须要做的第一选择。 1.使用类似生产的本地数据库服务器进行集成测试 对于生产环境&#xff0c;我始终喜欢使用增量DDL脚本&#xff…

select多查询,自连接,join 等

题目来源于leetcode中的数据库部分&#xff1a;181. Employees Earning More Than Their Managers 题目&#xff1a;The Employee table holds all employees including their managers. Every employee has an Id, and there is also a column for the manager Id. ----------…

4、Node.js REPL(交互式解释器)

Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境&#xff0c;类似 Window 系统的终端或 Unix/Linux shell&#xff0c;我们可以在终端中输入命令&#xff0c;并接收系统的响应。Node 自带了交互式解释器&#xff0c;可以执行以下任务&#xff1a; • 读…

有时候eclipse 导入maven项目 启动的时候回出现这样一个问题

严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/SpringMvcController]]at java.util.conc…

公众平台模板消息所在行业_第三方工具微信公众号模板消息群发如何操作?

当下&#xff0c;公众平台模板消息功能仅支持添加模板&#xff0c;修改所在行业&#xff0c;如果想要群发模板消息&#xff0c;可以自己根据公众平台的接口编程实现&#xff0c;也可通过微号帮平台的模板消息群发功能实现&#xff0c;均可以让微信公众号群发模板消息&#xff0…

java spark 读取json_apache-spark - 与aws-java-sdk链接时,在读取json文件时发生Spark崩溃 - 堆栈内存溢出...

让config.json成为一个小的json文件&#xff1a;{"toto": 1}我做了一个简单的代码&#xff0c;用sc.textFile读取json文件(因为文件可以在S3&#xff0c;本地或HDFS上&#xff0c;所以textFile很方便)import org.apache.spark.{SparkContext, SparkConf}object testA…

项目学生:带有Jersey的Web服务服务器

这是Project Student的一部分。 其他职位包括带有Jersey的Webservice Client &#xff0c; 业务层和带有Spring Data的持久性 。 RESTful Web应用程序洋葱的第二层是Web服务服务器。 它应该是一个薄层&#xff0c;用于包装对业务层的调用&#xff0c;但不对其自身进行大量处理…

在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试

在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试 原文:在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试版权声明&#xff1a;本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布&#xff0c;但务必保留文章署名…

java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取

通道(Channel)&#xff1a;由java.nio.channels包定义的&#xff0c;Channel表示IO源与目标打开的连接&#xff0c;Channel类似于传统的“流”&#xff0c;只不过Channel本身不能直接访问数据&#xff0c;Channel只能与Buffer进行交互。通道主要用于传输数据&#xff0c;从缓冲…

HTML标签类型

标签分类&#xff1a; 一、块标签&#xff1a;块标签是指本身属性为display:block;的元素。 1.默认占一行可以设置宽高&#xff0c; 2.在不设置宽度的情况下&#xff0c;块级元素的宽度是它父级元素内容的宽度 3.在不设置高度的情况下&#xff0c;块级元素的高度是它本身内容的…