当前位置: 首页 > news >正文

线段树基本操作——建树+单点修改+区间查询

保存:

struct tree
{
    int l,r;
    int data;
}t[N*4];

建树:

void bulid (int p,int l,int r)  //线段树建树
{
    t[p].l=l,t[p].r=r;
    if(l==r) { t[p].data=a[l];return ;}
    int mid=(l+r)/2;
    bulid(2*p,l,mid);
    bulid(2*p+1,mid+1,r);
    t[p].data=max(t[2*p].data,t[p*2+1].data);
}

单点修改:

void change(int p,int x,int v)
{
    if(t[p].l==t[p].r) { t[p].data=v;return ;}
    int mid =(t[p].l+t[p].r)/2;
    if(x<=mid) change(p*2,x,v);
    else change(2*p+1,x,v);
    t[p].data=max(t[p*2].data,t[2*p+1].data);
}

区间查询:以最简单的最大值为例

在找某一个区间的时候,会从大分解到小,最终一般都是有多个不同深度的节点返回多个区间段最大值。

根据当前节点的区间情况分为以下种种:

1.l <= pl <= pr <= r ,这中直接返回当前区间最大值。

2.pl <= l <= pr <=r,分为两种情况:

l>mid,只会递归进入右子树: 例如:区间[1,8]上找[5,8] ,此时有5>4,进入右子树[5,8];

l<=mid,两棵树都会进去,但右子树会立刻返回,比如[1,8]上找[4,8],此时有4>=4,进入右子树后,立刻有1<=5<=8<=8,此时可以直接返回。

3.l<=pl <= r<= pr ,与上述情况类似。

4.pl<=l<=r<=pr,分为两种情况:

(1) l 和 r 都小于mid或者大于mid,只会递归一颗子树。

(2) l 和 r 在mid的两侧,两颗都会递归进去,直到满足第一种情况。

int ask(int p,int l,int r)
{
    if(l<=t[p].l&&r>=t[p].r) return t[p].data;
    int mid=(t[p].l+t[p].r)/2;
    int val=-(1<<30);
    if(l<=mid) val=max(val,ask(2*p,l,r));
    if(r>mid) val=max(val,ask(2*p+1,l,r));
    return val;
}

区间查询的实质就是找线段树上可以组成[l,r]这个区间的所有节点区间。

相关文章:

  • python/php/java/nodejs通讯录管理系统vue+elementui
  • 【老生谈算法】matlab实现蒙特卡罗定积分源码——蒙特卡罗定积分
  • 卷积神经网络 - 从全连接层到卷积
  • selenium爬虫如何绕过反爬,看这一篇文章就足够了
  • c语言进阶:冒泡排序函数初步实现到逐步优化
  • 5年测试经验要个20K不过分吧,谁料面试官三个问题把我打发走了···
  • 内网渗透之Msf-Socks代理实战(CFS三层靶场渗透过程及思路)
  • 命令执行漏洞——远程命令执行
  • M0007 四则运算
  • 【机器学习】李宏毅——生成式对抗网络GAN
  • osi七层模型
  • 【Vue五分钟】五分钟了解webpack的高级概念
  • 【Linux】云服务器的购买与Linux远程连接
  • c++介绍与入门基础(详细总结)
  • 羊了个羊,日赚500万
  • 【前端学习】-粗谈选择器
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Apache的80端口被占用以及访问时报错403
  • C++类的相互关联
  • Django 博客开发教程 8 - 博客文章详情页
  • echarts花样作死的坑
  • JAVA_NIO系列——Channel和Buffer详解
  • js学习笔记
  • JS专题之继承
  • Laravel Mix运行时关于es2015报错解决方案
  • node学习系列之简单文件上传
  • Python爬虫--- 1.3 BS4库的解析器
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vue官网教程学习过程中值得记录的一些事情
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 那些年我们用过的显示性能指标
  • 前端临床手札——文件上传
  • Hibernate主键生成策略及选择
  • Spring第一个helloWorld
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (12)Hive调优——count distinct去重优化
  • (16)Reactor的测试——响应式Spring的道法术器
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (二)JAVA使用POI操作excel
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (一) storm的集群安装与配置
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • ***测试-HTTP方法
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core控制台应用程序初识
  • .net framework profiles /.net framework 配置
  • .net Signalr 使用笔记
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...