线段树初见——区间询问与改变最大值

前言

昨天某B组讲主席树,然后就作死的去听了,也没听懂(因为连线段树都不懂),然后好奇心就去问了一下老师线段树是个蛤,然后这篇博客就诞生了。

正题

首先线段树就是一个可以快速区间改变和询问的东东,实现方法就是用树啦。具体方法看下面。


首先我们讲一下例题:

最大值(jzoj1959)

一串序列,有2种操作

1.询问一个区间内的最大值
2.改变一个数的值

这道题明显没有用到区间改值,那这里先不扯区间改值:
以下线段树草图
草图
每个点表示的是一个区间内的树
建树代码

int build(int l,int r,int k)
{if (l==r) return tree[k].w=a[l];//如果只有一个数就直接返回int wz=(l+r)/2;//中间位置return tree[k].w=max(build(l,wz,2*k),build(wz+1,r,2*k+1));//分叉
}

然后是查找某区间
草图
草图
分成多份寻找需要的区间
查找代码

void find(int l,int r,int x,int y,int k)//表示在l~r之间需要x~y的最大值
{if (x==l && y==r) {ans=max(ans,tree[k].w);return;}int wz=(l+r)/2;//中心if (y<=wz) find(l,wz,x,y,2*k);//需要全包涵在左边else if (x>wz) find(wz+1,r,x,y,2*k+1);//需要全包涵在右边else {find(l,wz,x,wz,2*k);find(wz+1,r,wz+1,y,2*k+1);//有左也有右}return;
}

然后由于这道题只需要改变单个数的,瞎水水就过了
代码

#include<cstdio>
#include<iostream>
using namespace std;
struct point{int w,lazy;
}tree[400014];
int n,m,w,x,y,a[100007],ans;
int build(int l,int r,int k)//建数
{if (l==r) return tree[k].w=a[l];int wz=(l+r)/2;return tree[k].w=max(build(l,wz,2*k),build(wz+1,r,2*k+1));
}
void find(int l,int r,int x,int y,int k)//查找
{if (x==l && y==r) {ans=max(ans,tree[k].w);return;}int wz=(l+r)/2;if (y<=wz) find(l,wz,x,y,2*k);else if (x>wz) find(wz+1,r,x,y,2*k+1);else {find(l,wz,x,wz,2*k);find(wz+1,r,wz+1,y,2*k+1);}return;
}
void updata(int l,int r,int x,int y,int k)//改变
{if (l==x && r==x) {tree[k].w=y;return;}//改变并返回int wz=(l+r)/2;//确定位置if (x<=wz) updata(l,wz,x,y,2*k);//在左边else if (x>wz) updata(wz+1,r,x,y,2*k+1);//在右边tree[k].w=max(tree[2*k].w,tree[2*k+1].w);//更新值
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,n,1);//建树scanf("%d",&m);for (int i=1;i<=m;i++){scanf("%d",&w);if (w==2){scanf("%d%d",&x,&y);ans=0;find(1,n,x,y,1);//查找printf("%d\n",ans);}else if (w==1){scanf("%d%d",&x,&y);updata(1,n,x,y,1);//改变}}
}

最大值2(jzoj1960)

依旧是一个序列两种操作

1.询问一个区间内的值
2.让一个区间内的值加上一个数(可能是负数)

这里就需要用到区间改变了
草图
像查找一样,找到区间,如果直接改变整棵子树会超时,所以先标记,查找时在下传
草图
好了,区间改变代码

void updata(int l,int r,int x,int y,int num,int k)
{if (l==x && r==y) {tree[k].lazy+=num;//标记tree[k].w+=num;//改变自己return;}if (tree[k].lazy!=0)//顺便下传{tree[k*2].w+=tree[k].lazy;tree[k*2].lazy+=tree[k].lazy;tree[k*2+1].w+=tree[k].lazy;tree[k*2+1].lazy+=tree[k].lazy; tree[k].lazy=0;}int wz=(l+r)/2;//中心if (y<=wz) updata(l,wz,x,y,num,2*k);else if (x>wz) updata(wz+1,r,x,y,num,2*k+1);else {updata(l,wz,x,wz,num,2*k);updata(wz+1,r,wz+1,y,num,2*k+1);}tree[k].w=max(tree[2*k].w,tree[2*k+1].w);//更新
}

代码

#include<cstdio>
#include<iostream>
using namespace std;
struct point{long long w,lazy;
}tree[400030];
long long ans;
int n,m,w,x,y,a[100007],num;
int build(int l,int r,int k)//建树
{if (l==r) return tree[k].w=a[l];int wz=(l+r)/2;return tree[k].w=max(build(l,wz,2*k),build(wz+1,r,2*k+1));
}
void find(int l,int r,int x,int y,int k)//查找
{if (x==l && y==r) {ans=max(ans,tree[k].w);return;}if (tree[k].lazy!=0){tree[k*2].w+=tree[k].lazy;tree[k*2].lazy+=tree[k].lazy;tree[k*2+1].w+=tree[k].lazy;tree[k*2+1].lazy+=tree[k].lazy; tree[k].lazy=0;}int wz=(l+r)/2;if (y<=wz) find(l,wz,x,y,2*k);else if (x>wz) find(wz+1,r,x,y,2*k+1);else {find(l,wz,x,wz,2*k);find(wz+1,r,wz+1,y,2*k+1);}
}
void updata(int l,int r,int x,int y,int num,int k)//改值
{if (l==x && r==y) {tree[k].lazy+=num;tree[k].w+=num;return;}if (tree[k].lazy!=0){tree[k*2].w+=tree[k].lazy;tree[k*2].lazy+=tree[k].lazy;tree[k*2+1].w+=tree[k].lazy;tree[k*2+1].lazy+=tree[k].lazy; tree[k].lazy=0;}int wz=(l+r)/2;if (y<=wz) updata(l,wz,x,y,num,2*k);else if (x>wz) updata(wz+1,r,x,y,num,2*k+1);else {updata(l,wz,x,wz,num,2*k);updata(wz+1,r,wz+1,y,num,2*k+1);}tree[k].w=max(tree[2*k].w,tree[2*k+1].w);
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,n,1);scanf("%d",&m);for (int i=1;i<=m;i++){scanf("%d",&w);if (w==2){scanf("%d%d",&x,&y);//查找ans=-2147483647;find(1,n,x,y,1);printf("%lld\n",ans);}else if (w==1){scanf("%d%d%d",&x,&y,&num);//改值updata(1,n,x,y,num,1);}}
}

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

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

相关文章

关系数据库理论

依赖 候选码 三大范式 公理系统 求最小函数的依赖集 例 解 模式分解

19级:班级日常分享 | 一天一瞬间

点击上方蓝色关注我们&#xff01;昨天没有看到他们早读&#xff0c;有点失落。今天再一次去教室&#xff0c;还未走到门口呢&#xff0c;就听见教室里面的早读生透过门缝传出&#xff0c;甚是开心。在陪他们早读的时候&#xff0c;自己顺便读了几篇散文和古诗古文&#xff0c;…

在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

前言 Visual Studio 2017已经发布了很久了。做为集成了Asp.Net Core 1.1的地表最强IDE工具&#xff0c;越来越受.NET系的开发人员追捧。 随着Google Angular4的发布。我一直在想&#xff0c;怎么能够用这个地表最强IDE工具编写Angular4的Asp.Net Core项目。经过不懈的研究。终…

机器学习中向量化编程总结记录

转载自 机器学习中向量化编程总结记录 向量化编程总结记录 很多时候&#xff0c;我们在实现算法的时候&#xff0c;总会碰到累和的伪代码&#xff1a; 比如下面这个&#xff1a; 为了简单我这里只重复5次&#xff0c;但是原理是一样的。 很显然我们要得到这个结果&#xf…

Spring整合Mybatis-完成用户登录

①导入的jar包: ②在src下创建并配置applicationcontext.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛

前言 ……终于改完了&#xff0c;像之前小L一样崩溃。今天C组和B组一起做题&#xff0c;所以…… 正题 题目1&#xff1a;教主的花园&#xff08;jzoj1792&#xff09; 一平面直角坐标系&#xff0c;在x轴的位置建立一堵墙&#xff0c;墙上有n道门&#xff0c;给出门的位置&a…

刘奕佳: 我的职校新生活 | 班级日常分享

点击上方蓝色关注我们&#xff01;时光匆匆&#xff0c;一转眼到了开学季&#xff0c;校园里弥漫着浓重的书香之气踏入校园&#xff0c;映入眼帘的就是雄伟的教学楼&#xff0c;意气风发的朗朗书声&#xff0c;让人情不自禁的陷入深深的学习中。实训楼当熟悉的上下课铃声又在我…

一个非常好的依存句法可视化工具

转载自 一个非常好的依存句法可视化工具 一个非常好的依存句法可视化工具 在依存句法研究中&#xff0c;常见的CONLL格式的句法树库&#xff0c;一眼看上去就不是太明白整棵树的结构。 这里分享推荐一个南京大学nlp实验室制作的一个依存句法可视化工具&#xff0c;效果如图…

DDD理论学习系列(8)-- 应用服务amp;amp;领域服务

1. 引言 单从字面理解&#xff0c;不管是领域服务还是应用服务&#xff0c;都是服务。而什么是服务&#xff1f;从SOA到微服务&#xff0c;它们所描述的服务都是一个宽泛的概念&#xff0c;我们可以理解为服务是行为的抽象。从前缀来看&#xff0c;根据DDD的经典分层架构&…

纪念中学15-5(=10)天感想

来自水lao ten days の 感想 前言 时光飞逝&#xff0c;转眼间&#xff0c;纪念中学的10天生活就那么过去了。回想起刚来&#xff0c;仿佛就在昨天。今天我将要离开这里&#xff0c;总感觉有无限的遗憾&#xff0c;无限的失落。可是花朵总是要谢&#xff0c;时光不停流逝。我…

祝张远远和杨凯博同学生日快乐 | 班级日常分享

点击上方蓝色关注我们&#xff01;首先祝张远远和杨凯博同学生日快乐&#xff01;上午丁老师和我说&#xff0c;今天是张远远同学的生日&#xff0c;于是我们就简单的商量了下&#xff0c;准备弄个活动&#xff0c;祝一下张远远同学生日快乐&#xff01;待下午时&#xff0c;获…

开放对静态资源的访问

前端控制器先进行处理&#xff0c;处理不了的交给default… 缺一不可

通俗理解维特比算法

转载自 通俗理解维特比算法 本文假定读者有一定的隐马模型基础&#xff01;或者大家可以参考这两篇文章。 隐马尔科夫模型-基本模型与三个基本问题和隐马尔科夫模型-前向算法 维特比算法说白了就是动态规划实现最短路径&#xff0c;只要知道“动态规划可以降低复杂度”这一…

使用docker-compose搭建AspNetCore开发环境

1 使用docker-compose搭建开发环境 我们的目标很简单&#xff1a;使用docker-compose把若干个docker容器组合起来就成了。 首先使用Nginx代理所有的Web程序&#xff0c;这样只需要在主机上监听一个端口就可以了&#xff0c;不污染主机。再组合各Web程序、Redis/Memcached、Sq…

珍惜、珍爱!

点击上方蓝色关注我们&#xff01;这是一篇付费文章&#xff0c;其实目的就是不让人看&#xff0c;哈哈哈&#xff01;不让别人看为什么还要写&#xff1f;因为写了才痛快&#xff01;

SpringAOP的SchemaBase方式

文章目录1、SpringAOP的专业概念:2、SpringAOP的SchemaBase方式基本流程SchemaBase方式环绕通知方式实现AOPSchemaBase方式的异常通知SpringAOP的SchemaBase方法的参数1、SpringAOP的专业概念: 真实对象: 要进行功能扩展的对象,相当于A对象 代理对象: 完成功能扩展的对象,相当于…

ssl2661-廉价最短路径【SPFA】

前言 这是一篇迟到的博客 题目 找一条最廉价的最短路径 输入输出&#xff08;建议无视&#xff09; Input 输入文件第一行有两个整数m和n&#xff0c;用一个空格隔开&#xff0c;其中&#xff0c;m是顶点数&#xff0c;而n是边数。接下来的n行给出所有的边及其价值&#…

自然语言处理的十个发展趋势

转载自 哈工大刘挺教授&#xff1a;自然语言处理的十个发展趋势 近日&#xff0c;由中国人工智能学会、阿里巴巴集团 & 蚂蚁金服主办&#xff0c;CSDN、中国科学院自动化研究所承办的第三届中国人工智能大会&#xff08;CCAI 2017&#xff09;在杭州国际会议中心盛大开幕…

SpringAOP的Aspectj方式*

SpringAOP的Aspectj介绍 问题: 目前我们已经能够使用SpringAOP的SchemaBased方式来实现功能扩展。在使用SchemaBased方式实现功能扩展时&#xff0c;发现一个扩展代码就需要声明对应的实现了指定的接口的类&#xff0c;这样造成代码的结构体系过于繁杂。一个通知一个类。 解决…

拥抱.NET Core系列:依赖注入(1)

前言 DIP、IoC、DI 说起DI不得不提IoC这个模式&#xff0c;很多人会把DI和IoC混为一谈&#xff0c;但其实这两者是概念和实现的关系。 依赖倒置原则&#xff08;DIP&#xff09;&#xff1a;软件设计原则&#xff0c;要依赖于抽象&#xff0c;不要依赖具体实现。 控制反转&…