首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏desperate633

    LintCode 线段系列问题(线段的构造,线段的构造||,线段的查询,线段的查询II,线段的修改)线段的构造线段的构造 II线段的查询线段查询 II线段的修改

    线段(又称区间), 是一种高级数据结构,他可以支持这样的一些操作: 查找给定的点包含在了哪些区间内 查找给定的区间包含了哪些点 线段的构造 题目 线段是一棵二叉,他的每个节点包含了两个额外的属性 实现一个 build 方法,接受 start 和 end 作为参数, 然后构造一个代表区间 [start, end] 的线段,返回这棵线段的根。 样例 对于数组 [1, 4, 2, 3], 对应的线段为: query(root, 1, 1), return 4 query(root, 1, 2), return 4 query(root, 样例 对于数组 [0, 空,2, 3], 对应的线段为: ? 样例 对于线段: ?

    90230发布于 2018-08-22
  • 来自专栏数据结构与算法

    codevs4919 线段练习4

    内每个数增加X,如果是count,表示统计区间[a,b]能被7整除的个数 输出描述 Output Description 对于每个询问输出一行一个答案 样例输入 Sample Input 3  2 3 4 分类标签 Tags 点此展开  记录好%7的剩余系 暴力统计即可 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4

    71250发布于 2018-04-12
  • 来自专栏追不上乌龟的兔子

    线段

    线段 (有关线段的定义来自LintCode网站的相关题目) 描述 线段是一棵二叉,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。 说明 线段(又称区间), 是一种高级数据结构,他可以支持这样的一些操作: 查找给定的点包含在了哪些区间内 查找给定的区间包含了哪些点 样例 比如给定start=1, end=6,对应的线段为: 最大线段 纯粹的线段并不能应用于太多的实际问题,一般来说线段的节点除了start和end之外,还会有一个额外的属性值,我们以最大线段为例,最大线段的每一个节点还有一个代表区间中最大值的max 该方法将root为根的线段中 [start,end] = [index,index] 的节点修改为了新的value,并确保在修改后,线段的每个节点的max属性仍然具有正确的值。 样例 对于线段: [1, 4, max=3] / \ [1, 2, max

    4.1K91发布于 2018-06-20
  • 来自专栏魔法书

    线段(区间

    如果现在数组中有十个元素,相应的线段就不是二叉了,如下: 注意:线段不是完全二叉,但线段是平衡二叉,当然堆也是平衡二叉。 为什么最坏情况是如果n=2k+1,需要4n的空间呢? 所以为了考虑到最坏的情况,如果区间有n个元素,数组表示需要4n的空间,由于我们的线段不考虑添加元素,即区间固定,使用4n的静态空间就可以了。 的静态数组 tree = (E[])new Object[arr.length*4]; } //获取线段中实际元素的个数 public int getSize 的静态数组 tree = (E[])new Object[arr.length*4]; //递归构建一颗线段 buildSegmentTree(0,0,

    60810编辑于 2024-01-19
  • 来自专栏阿伟的个人博客

    线段

    为了降低上述两操作的平均时间复杂度,引入线段这种数据结构,使得update 和 query的时间复杂度都变为O(log(N))。 线段的每个节点存储某一个段区间之和,其中每个结点的左子树和右子树分别存储当前结点的前半段之和和后半段之和,叶子结点存储的线段长度为1,根结点存储整个数组之和。 如下举例说明: 对于nums = [1, 2, 3, 4, 5, 6],线段树结构如下图所示: ? 由于我们发现其构成的线段类似完全二叉。因此可以使用像大/小根堆中的存储二叉的方式存储该。 建树过程 一般使用4倍的原数组的大小存储该。 对于当前结点,首先完成左孩子和右孩子的创建,之后其的值等于左右孩子值之和。 baseline为当前结点为叶子结点时,当前结点值即为nums元素值。 public IntervalTree(int[] nums) { this.nums = nums; this.tree = new int[nums.length * 4]

    65310发布于 2020-10-09
  • 来自专栏分享学习

    线段

    简单线段过程详解 #include<iostream> //——————————>debug 了一上午才把这个程序运行的过程在脑子里有了思路 #include<string.h> 这个可定义其他数----------->这个 主要是控制数组的大小, using namespace std; struct node { //结构体 ,相当于创建的二叉 /lazy记录延迟,sum记录在这个节点的左右端点之间的总和 int mid() { return (left + right) / 2; } }T[maxsize<<2];//相当于扩大了4倍 的比度为2的多1有n个数说明n个叶子节点要建立2*n-1个点但是 //因为假若数据相对较大,则访问到了最后一行,则可能用到 n<<1 这种情况就会越界会re所以开4

    55210发布于 2020-03-25
  • 来自专栏EmoryHuang's Blog

    线段模板

    线段模板 线段是算法竞赛中常用的用来维护 区间信息 的数据结构。 线段可以在 图片 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 线段 + Lazy(数组) class SegmentTree: def __init__(self, nums) -> None: self.n = len(nums) self.nums = nums self.tree = [0] * (4 * self.n) self.lazy = [0] * (4 * self.n) self.build(1, self.n, 1) def build(self, start, end, idx): # 对 [start, end] 区间建立线段,当前根的编号为 node.lazy node.right.lazy += node.lazy # 清空当前节点的标记 node.lazy = 0 参考资料 线段

    59010编辑于 2022-10-31
  • 来自专栏机器学习炼丹之旅

    线段(模板)

    刚学了线段,趁现在理解比较清楚,写篇博客供以后翻阅,线段有很多应用,如求区间总和,最大值,最小值等,总之求区间问题都可以想想线段,这里以求和为例 定义全局变量 const int maxn=1e5 10; struct node { int L,R;//当前节点的左右区间 long long big,sum,lazy;//数据类型根据题意改,sum为当前节点的总和 } tree[4* namespace std; const int maxn=1e5+10; struct node { int L,R; long long big,sum,lazy; } tree[4*

    51710编辑于 2022-06-29
  • 来自专栏指点的专栏

    线段初探

    可能这样说还是有点抽象,下面我们用一个具体的例子来看: 在文章开头的那个问题中,我们假设当前 n 为 8 ,这八个数字分别为:5, 1, 4, 9, 2, 6, 3, 7 此时,先不管这颗二叉的构造过程 现在如果需要用线段来保存对应区间的值,那么构造出来的线段就是这样的: ? 我们可以发现,这颗线段是不满足国内的满二叉的定义的,因为其最后一层的节点数(2)并未达到该层的最大值(2^2 = 4),但是对比国外的满二叉的性质,我们可以发现它是满足的。 3、线段一旦构造好,其区间范围不能更改,如果要更改区间范围,那么就需要重新构造一颗新的线段4、对于一个表示范围为 [0, n] 的线段,所含的节点个数为 n + n/2 + n/4 + … + 1 = 2n, 其建树的时间复杂度为 O(2n),即为 O(n) 如果想做题练习的话,可以试试下面的

    73330发布于 2019-01-18
  • 来自专栏以终为始

    线段QWQ

    一直没碰过线段,个人认为好长好难,不过这几天做题遇到了裸的线段的题,TAT。 线段我理解就是把二叉的左右节点现在分别看成是两个区间。 那么现在这两个区间的端点怎么存放? 一般需要开4倍空间才可以。 (当时自我感觉认为3倍就够了,但是RE了一次,可以在纸上手动画一下,帮助理解) 线段一般就是来解决比较直观的问题(当然也有好多神级题目来考你的线段,这里暂时忽略一下),比如给你一个N长度的一 组数, 这样的问题就可以用线段来解决了。 线段多做做就好啦,QWQ。

    53720编辑于 2023-03-09
  • 来自专栏yhlin's blog

    图解线段

    线段 ----   线段是算法竞赛中常用的用来维护 区间信息 的数据结构。线段可以在 O(\log_{2}{N}) 的时间复杂度内实现单点修改、区间修改、区间查询等操作。 线段的基本结构 ---- 为数组(假设下标从 1 开始): a[5] = [{1,2,3,4,5}] 构造线段如下图(采用堆式存储): 上述数组 D 用来保存线段,由于采用的是堆式存储 线段的建立 由于递归定义的,因此其建立也是递归的: void buildST(int left, int right, int p, vector<int>& D, vector<int> & mid, p*2, D, a); build(mid+1, right, p*2+1, D, a); D[p] = D[p * 2] + D[p * 2 + 1]; } ---- 线段的区间查询 ---- 区间和: // [left,right] 为待查区间,[cl,cr] 为当前区间,p 为当前节点编号,D 为线段的存储数组 int getSum(int left, int right

    87830编辑于 2023-02-27
  • 来自专栏yifei的专栏

    线段笔记

    线段就是利用二叉这种数据结构,来维护区间信息的一种数据结构。 简介 二叉的每个结点,都代表一段区间。 下面以区间和问题为例,对线段的实现进行讲解。 /o(logn+k) 另外线段可以用结构体指针来索引左右孩子,也可以用数组来存储(申请的长度至少要4n),本文选用前者。 如果第二次再更新3~4,在向下寻找线段3~4的过程中,要将之前的更新操作往下落实。于是就将1~4上的updateval清零,然后将该更新操作往下分别实施到1~2和3~4上。 从入门到进阶 线段标记永久化 学习笔记【线段】 使用线段实现简单的内存管理 线段详解

    73610编辑于 2022-11-14
  • 来自专栏Unclezhou's Blog

    线段模板

    概述:线段是算法竞赛中常用的数据结构(虽然考场中很少用,毕竟调起来麻烦,区间求和用树状组还是更加方便代码也短)。 线段可以在O(logN)的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 简略的描述一下算法思路,线段是一个二叉的每一个节点存储的都是一个区间内的值(根据具体的题目而定),每个父结点的值由两个子结点的值决定。 但是普通的二分思想并不能体现线段的精髓所在,线段的精髓就在于它的懒标记,具体往下看。算法的实现://建议初学者先看无懒标记版,在最下面。 tr<<1|1 //右儿子建树(build)struct segmentTree{int l,r; //查询的区间范围long long sum ,lz; //区间和,懒标记}t[N<<2];//要开4*

    52320编辑于 2023-07-25
  • 来自专栏程序员小灰

    什么是 “线段” ?

    在学习线段的概念的时候,我们就知道线段的每个节点都存储了一个区间。比如说对于[1,10]这个节点,也就是这棵线段的根节点,那么它的值为1+5+1+3+4+2+0+9+0+9=34。 他们的值如下: 元素个数为10个 原序列为[0,1,5,1,3,4,2,0,9,0,9] 现在问题在于,存储线段的数组应该开多大的空间? 根据证明发现,一个有n个元素的序列,所对应的线段至少需要大小为4n的数组来存储。这一类证明网上有很多,读者可以自行查阅一下。 这样下来就完成了整棵的初始化。 线段的单点修改 现在假如我们需要把第6个元素从2修改为3: ? 那么就会有很多的区间相应的改变。比如说区间[5,7],从4+2+0=6变成了4+3+0=7。 线段的完整代码 最后,附上线段的完整代码实现: static int n = 10; // n是元素个数 static int[] array = {0, 1, 5, 1, 3, 4, 2, 0,

    1.8K40发布于 2020-06-29
  • 来自专栏wym

    P3372 【模板】线段 1 线段模版+懒惰标记

    【模板】线段 1 #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 100005; int a[maxn]; struct N{ int l,r; ll pre,add; }node[4*maxn+5]; void build(int p,int l,int r){//区间编号p

    88820发布于 2019-05-06
  • 来自专栏AngelNI

    线段Segment Tree

    迷茫 线段学习 问题导入 给定一个长度为n的数组,有m次操作,每次操作可能如下: 1,修改 a[i] 的值 2,求连续一段区间的和 3, 求连续一段区间的最大值/最小值 4,给区间的每个数加上k 5, 所以线段就诞生了。 线段 线段类似下图树状结构,用蒟蒻语说,就是“树状区间和”,即将一个二分过程表现出来。通过改变大区间的值,来实现短时区间计算。时间复杂度可以优化到O(logn) ? 线段操作 1.建树 建树采用二分的方法 void build(int l,int r,int node) { if(l==r) { scanf("%d",&tree[node } if(mid+1<=R) { sum+=query_sum(L,R,mid+1,r,node*2+1); } return sum; } 4.

    94410发布于 2020-04-16
  • 来自专栏后台技术底层理解

    线段详解分析

    什么是线段? 是用来存放给定区间(segment, or interval)内对应信息的一种数据结构。 对应于树状数组,线段进行更新(update)的操作为O(logn),进行区间查询(range query)的操作也为O(logn)。 线段是用一个完全二叉来存储对应于其每一个区间(segment)的数据。该二叉的每一个结点中保存着相对应于这一个区间的信息。 同时,线段所使用的这个二叉是用一个数组保存的,与堆(Heap)的实现方式相同。 线段的作用? 线段可以使用log(n) 的时间复杂度来进行更新和查询数组范围的和。 构建线段 线段在初始化时可以创建4倍原数组大小的空间 static class SegmentTree { int[] tree; int N = 100;

    82210发布于 2020-09-10
  • 来自专栏小樱的经验随笔

    线段入门总结

    线段的入门级 总结       线段是一种二叉搜索,与区间相似,它将一个区间划分成一些单元区间,每个单元区间对应线段中的一个叶结点。        对于线段中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。 因此线段是平衡二叉,最后的子节点数目为N,即整个线段区间的长度。       使用线段可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。 【创建线段(初始化)】:        由于线段是用二叉树结构储存的,而且是近乎完全二叉的,所以在这里我使用了数组来代替链表上图中区间上面的红色数字表示了结构体数组中对应的下标。 1(右) 有了这样的关系之后,我们便能很方便的写出创建线段的代码了。

    1.3K60发布于 2018-04-08
  • 来自专栏数据结构与算法

    1080 线段练习

    1080 线段练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数。 输出描述 Output Description 共m行,每个整数 样例输入 Sample Input 6 4  5  6  2  1  3 4 1 3 5 2 1 4 1 1 9 2 2 6 样例输出 分类标签 Tags 点此展开 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXN=1000001; 7 int n,m; 8 int a[MAXN]; 9 int sum[MAXN*4]; 10

    96960发布于 2018-04-13
  • 来自专栏glm的全栈学习之路

    学习模板(线段

    原题 传送门 分析:采用模板线段 #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<cstring namespace std; int n,m,a[500005],ans; struct node { int left,right; int sum; }tree[2000020];//4*

    46440发布于 2020-09-28
领券