首页 > 其他分享 >动态开点线段树

动态开点线段树

时间:2024-06-19 20:45:14浏览次数:12  
标签:return int 线段 mid ans 动态 ql

众所周知,线段树要开 \(4\) 倍空间,但是这样会浪费许多空间,所以动态开点线段树就诞生了。

动态开点线段树适用于 \(n\) 比较大的情况,它没有优化时间复杂度,优化的是空间复杂度。具体的,我们不再用 \(p\times 2\) 和 \(p\times 2 + 1\) 作为 \(p\) 的左右儿子了,而用两个数组 \(ls_{p}\) 和 \(rs_{p}\) 来代表。我们在访问一个结点时,如果它没有,那么就创造。所以,结点只有在有需要的时候才被创建。当我们需要访问某个子区间时,才建立代表这个区间的子结点。

\(\mathcal{Code}\)

void updata(int &p, int l, int r, int x, int k) { // 相当于原来的 build,可以循环暴力修改
  if (!p) { // 如果没有当前结点
    p = ++cnt;
  }
  if (l == r) {
    minn[p] += k;
    return ;
  }
  int mid = (l + r) >> 1;
  if (x <= mid) {
    updata(ls[p], l, mid, x, k);
  } else {
    updata(rs[p], mid + 1, r, x, k);
  }
  pushup(p);
}

int query(int p, int l, int r, int ql, int qr) {
  if (p == 0) { // 不存在,返回 0
    return 0;
  }
  if (ql <= l && qr >= r) {
    return minn[p];
  }
  int mid = (l + r) >> 1, ans = 1e9;
  if (ql <= mid) {
    ans = min(ans, query(ls[p], l, mid, ql, qr));
  }
  if (qr > mid) {
    ans = min(ans, query(rs[p], mid + 1, r, ql, qr));
  }
  return ans;
}

标签:return,int,线段,mid,ans,动态,ql
From: https://www.cnblogs.com/ydq1101/p/18256825

相关文章

  • 力扣每日一题 6/19 排序+动态规划
    博客主页:誓则盟约系列专栏:IT竞赛专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • (nice!!!)LeetCode 2713. 矩阵中严格递增的单元格数(动态规划、哈希表)
    2713.矩阵中严格递增的单元格数思路:1、先对数组中的元素按值从小到大处理2、对于当前的元素值,可以更新当前所在行和列的最大值。3、最后每一行或每一列的最大值即为所求值细节看注释classSolution{public:intmaxIncreasingCells(vector<vector<int>>&mat......
  • 静态库与动态库的使用
    一、什么是库库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。库文件是事先编译好的方法的合集。二、静态库与动态库的区别1、静态库的扩......
  • css如何动态累计数字?
    导读:css如何动态累计数字?用于章节目录的序列数生成,用css的计数器实现起来比js方式更简单!伪元素::after::before伪元素设置content可以在元素的首部和尾部添加内容,我们要在元素的首部添加序列号,所以要用到的是::before的content属性计数器counter-reset初始化或重置......
  • SQL SERVER 动态行转列代码
    在实际的项目操作中,数据统计偶尔会用到SQLServer的行转列,数据表MG_TicketsHistoryData如下:列名数据类型描述TicketDatedateTicketCodenchar(10)TicketADJClosedecimal(18,2)使用SQLServer动态行转列,代码如下:CREATEproc[dbo].[PIVOT_TicketsHisData]@start_datevarch......
  • spring boot jpa 进行通用多条件动态查询和更新 接口
    原因:jpa没有类似于mybatis的那种拼接sql的方式想动态更新需要使用CriteriaUpdate的方式去一直拼接,其实大多数场景只要传入一个非空实体类,去动态拼接sql1.定义实体类继承一个统一的类型@Data@ToString@Entity@Table(name="sys_user")@DynamicInsert@JsonIgno......
  • Linux命令ldd:深入解析动态链接器依赖关系
    Linux命令ldd:深入解析动态链接器依赖关系在Linux系统中,ldd(ListDynamicDependencies)是一个强大的命令行工具,用于列出可执行文件或共享库所依赖的共享库。虽然ldd在数据处理和分析的直接用途上可能并不明显,但它对于系统管理员、软件开发者以及任何对系统底层工作感兴趣的人......
  • 理解 C++ 中的对象类型与绑定机制:静态绑定 vs 动态绑定
    静态绑定和动态绑定概念解释对象的静态类型:对象在声明时采用的类型,在编译期确定,无法更改。对象的动态类型:对象在运行期实际表现的类型,在运行期决定,对象的动态类型可以更改(通过多态和指针/引用的方式)。静态绑定:绑定的是对象的静态类型,某特性(比如函数调用)依赖于对象的静......
  • js+css元素动态出现,前端让元素从底部动态显现,前端让元素从底部跳跃显示
    实现效果实现原理一点也不复杂,耐心看完,思路理解后直接复制粘贴即可使用1.为想要动态出现的元素添加指定class类名,我这里用(animate-element)2.监听屏幕滚动,屏幕滚动时,如果屏幕高度减去元素顶部相对于屏幕的位置大于0的话,说明已经滚动到当前元素,然后给这个元素添加c......
  • java freemarker实现单元格动态合并
    在Java项目中,使用FreeMarker模板引擎来动态生成Excel文件,并实现单元格的动态合并(特别是行合并)。可以通过以下步骤来完成:1.准备数据模型        需要准备一个合适的数据模型,该模型应能表示出哪些单元格需要合并。        例如,如果想要根据某一列的值来决定......